如何检查我的模板类是否具有特定的类型?

huy*_*huy 25 c++ templates

在我的模板化函数中,我试图检查类型T是否是特定类型.我该怎么办?

p/s我知道模板规范方式,但我不想这样做.

template<class T> int foo(T a) {
  // check if T of type, say, String?
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

dir*_*tly 49

而不是检查类型使用专业化.否则,请勿使用模板.

template<class T> int foo(T a) {
      // generic implementation
}
template<> int foo(SpecialType a) {
  // will be selected by compiler 
}

SpecialType x;
OtherType y;
foo(x); // calls second, specialized version
foo(y); // calls generic version
Run Code Online (Sandbox Code Playgroud)

  • 专门化函数模板通常不是一个好主意;不支持部分特化,如果混合特化和重载,通常会得到意想不到的结果。从一开始就超载。 (2认同)

Ben*_*oît 13

如果您不关心编译时,可以使用boost :: is_same.

bool isString = boost::is_same<T, std::string>::value;
Run Code Online (Sandbox Code Playgroud)

从C++ 11开始,它现在是标准库的一部分

bool isString = std::is_same<T, std::string>::value
Run Code Online (Sandbox Code Playgroud)

  • 记录:[is_same](http://en.cppreference.com/w/cpp/types/is_same)现在是标准库的一部分. (4认同)

vis*_*tor 11

嗯因为在"规范"部分之前我有相同代码的很大一部分.

您可以使用重载,但如果大部分代码适用于任何类型,您可以考虑将不同的部分提取到单独的函数中并重载.

template <class T>
void specific(const T&);

void specific(const std::string&);

template <class T>
void something(const T& t)
{
    //code that works on all types
    specific(t);
    //more code that works on all types
}
Run Code Online (Sandbox Code Playgroud)


ser*_*iom 7

我想你可以使用std::type_infotypeid运算符返回的

  • 警告:运行时检查.因此,您不能依赖编译时属性.例如,在检查T == std :: string之后,你不能只使用`operator []`. (7认同)

Joh*_*itb 7

我怀疑有人应该告诉你为什么不使用重载或专业化不是一个好主意.考虑:

template<class T> int foo(T a) {
  if(isAString<T>()) {
    return a.length();
  } else {
    return a;
  }
}
Run Code Online (Sandbox Code Playgroud)

你可能会第一眼看到它也会起作用int,因为它只会尝试调用length字符串.但这种直觉是错误的:即使在运行时没有采用该分支,编译器仍会检查字符串分支.如果T是int ,它会发现你试图在非类上调用成员函数.

如果您需要不同的行为,那么您应该将代码分开.但是更好地使用重载而不是专门化,因为它更容易弄清楚事情是如何工作的.

template<class T> int foo(T a) {
  return a;
}

int foo(std::string const& a) {
  return a.length();
}
Run Code Online (Sandbox Code Playgroud)

您还可以更好地分离不同行为路径的代码.它不再是全部了.请注意,在重载时,参数可能具有不同的类型形式,如果两者都匹配良好,编译器仍将使用正确的版本,如下所示:一个可以是引用,而另一个不能.