我希望执行以下(显然)无效代码的有效C++11等效:
class StaticMethodClass {
public:
static int staticMethod(int a) {return 0;}
};
#include <type_traits>
template<class T> class ClassTemplate {
public:
decltype(T::staticMethod(int)) methodTemplate(int a);
};
template<class T>
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) {
return T::staticMethod(a);
}
template class ClassTemplate<StaticMethodClass>;我从我的编译器中得到以下错误:
/tmp$ g++ -std=c++11 -c a.cpp
a.cpp:14:26: error: expected primary-expression before ‘int’
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) {
^
a.cpp:14:32: error: prototype for ‘decltype (T:: staticMethod(<expression error>)) ClassTemplate<T>::methodTemplate(int)’ does not match any in class ‘ClassTemplate<T>’
decltype(T::staticMethod(int)) ClassTemplate<T>::methodTemplate(int a) {
^
a.cpp:10:36: error: candidate is: int ClassTemplate<T>::methodTemplate(int)
decltype(T::staticMethod(int)) methodTemplate(int a);
^
/tmp$ g++ -dumpversion
4.8.3我想做什么是可能的吗?如果是这样的话,是怎么做的?
发布于 2016-10-13 21:44:21
我认为std::result_of不是这样工作的。它被定义为result_of<F(ArgTypes...)> (参见优先选择)。F参数应该是一个类型。当您编写T::staticMethod时,您给的是result_of函数,而不是类型。
F必须是可调用类型、函数引用或可调用类型引用。用ArgTypes调用F..。一定是个很好的表达方式。
因此,您想要的是给result_of提供对该函数的引用类型。指向该函数的指针由&T::staticMethod提供,其类型由decltype(&T::staticMethod)提供。这个密码起作用了。
typename std::result_of<decltype(&T::staticMethod)(int)>::type methodTemplate(int i) {
return T::staticMethod(i);
}还请注意typename,克里斯指出了这一点。
发布于 2016-10-13 21:27:33
auto应该是其中的诀窍:
auto methodTemplate(int i) -> decltype(T::staticMethod(i)) {
return T::staticMethod(i);
}在C++14中,您可以跳过decltype
auto methodTemplate(int i) {
return T::staticMethod(i);
}发布于 2016-10-13 21:25:05
此工作(http://ideone.com/6pczX3):
decltype(T::staticMethod(int)) methodTemplate(int i) {
return T::staticMethod(i);
}起初,我认为您可能只需要适当地添加typename,但这是行不通的。
https://stackoverflow.com/questions/40031233
复制相似问题