【发布时间】:2020-05-23 12:35:47
【问题描述】:
我有一个函数模板,它接受许多不同类型的输入。在这些类型中,只有一种具有getInt() 函数。因此,我希望代码仅针对该类型运行该函数。请提出解决方案。谢谢
#include <type_traits>
#include <typeinfo>
class X {
public:
int getInt(){
return 9;
}
};
class Y{
};
template<typename T>
void f(T& v){
// error: 'class Y' has no member named 'getInt'
// also tried std::is_same<T, X>::value
if(typeid(T).name() == typeid(X).name()){
int i = v.getInt();// I want this to be called for X only
}
}
int main(){
Y y;
f(y);
}
【问题讨论】:
-
与您的问题无关,但
type_info结构具有equality comparison operator,因此typeid(T) == typeid(X)应该也可以工作。 -
使用:
if constexpr,条件为is_same_v<T,X>。 -
今年晚些时候,Concepts 的解决方案将正式变得更加优雅。我知道,现在不是很有帮助。
-
有很多方法可以解决您的问题。上面提到的一对。您还可以使用不同变体的 traits 来查看类型是否具有可调用的
getInt成员。仅在 stackoverflow.com 上,如果您稍微搜索一下,如何查看结构或类是否具有特定的成员函数,这里肯定有很多问题。
标签: c++ c++11 templates c++14 metaprogramming