在我的模板化函数中,我试图检查类型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)
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)
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)
我想你可以使用std::type_infotypeid运算符返回的
我怀疑有人应该告诉你为什么不使用重载或专业化不是一个好主意.考虑:
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)
您还可以更好地分离不同行为路径的代码.它不再是全部了.请注意,在重载时,参数可能具有不同的类型形式,如果两者都匹配良好,编译器仍将使用正确的版本,如下所示:一个可以是引用,而另一个不能.
| 归档时间: |
|
| 查看次数: |
44565 次 |
| 最近记录: |