模糊功能模板

时间:2018-08-07 08:22:57

标签: c++ templates enable-if

我想通过将enable_if应用于返回类型来选择特定的功能模板。

一个简单的例子是区分有符号和无符号参数。

#include <iostream>
#include <type_traits>

template<typename T>
typename std::enable_if<std::is_signed_v<T>, bool>
foo(T t)
{
  return true;
}

template<typename T>
typename std::enable_if<!std::is_signed_v<T>, bool>
foo(T t)
{
  return false;
}

int main(){
  std::cout << foo<uint32_t>(42) << std::endl;

  return 0;
}

在这里我得到编译器错误:call of overloaded ‘foo<uint32_t>(int)’ is ambiguous std::cout << foo<uint32_t>(42) << std::endl;

我知道如果我使用foo(42)将会是模棱两可的,因为42可以转换为带符号的无符号。但是,如果像我的示例中那样明确指定tempalte参数,我希望它可以正常工作。

我的代码有什么问题,我该如何解决?

2 个答案:

答案 0 :(得分:3)

::type的末尾缺少enable_if,因此即使条件为假,也不会发生错误

您可以使用enable_if_t或像这样添加::type

typename std::enable_if<std::is_signed_v<T>, bool>::type

答案 1 :(得分:1)

泰克(Tyker)已回答您,您::type中缺少enable_if

通过使用std::enable_if_tsince C++14)可以减少样板数量

template<typename T>
std::enable_if_t<std::is_signed_v<T>, bool>
foo(T t)
{
  return true;
}

template<typename T>
std::enable_if_t<!std::is_signed_v<T>, bool>
foo(T t)
{
  return false;
}