gpt4 book ai didi

c++ - 如何将C++模板方法的返回类型声明为其他类中静态方法的返回类型?

转载 作者:搜寻专家 更新时间:2023-10-31 00:56:16 25 4
gpt4 key购买 nike

我想执行与以下(显然)无效代码等效的有效 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

我想做的事可行吗?如果是,怎么办?

最佳答案

我不认为std::result_of以这种方式工作。它被定义为 result_of<F(ArgTypes...)> (参见 cppreference)。那F参数应该是一个类型。当你写 T::staticMethod你给result_of 函数,而不是类型

F must be a callable type, reference to function, or reference to callable type. Invoking F with ArgTypes... must be a well-formed expression.

所以你想要的是给result_of对该函数的引用类型。 &T::staticMethod 给出了指向该函数的指针。 , 其类型为 decltype(&T::staticMethod) .此代码有效。

typename std::result_of<decltype(&T::staticMethod)(int)>::type methodTemplate(int i) {
return T::staticMethod(i);
}

另请注意 typename正如 Chris 指出的那样.

关于c++ - 如何将C++模板方法的返回类型声明为其他类中静态方法的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40031233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com