首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将C++模板方法的返回类型声明为其他类中的静态方法?

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

Stack Overflow用户
提问于 2016-10-13 21:22:57
回答 4查看 598关注 0票数 2

我希望执行以下(显然)无效代码的有效C++11等效:

代码语言:javascript
复制
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>;

我从我的编译器中得到以下错误:

代码语言:javascript
复制
/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

我想做什么是可能的吗?如果是这样的话,是怎么做的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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)提供。这个密码起作用了。

代码语言:javascript
复制
typename std::result_of<decltype(&T::staticMethod)(int)>::type methodTemplate(int i) {
    return T::staticMethod(i);
}

还请注意typename克里斯指出了这一点。

票数 2
EN

Stack Overflow用户

发布于 2016-10-13 21:27:33

auto应该是其中的诀窍:

代码语言:javascript
复制
auto methodTemplate(int i) -> decltype(T::staticMethod(i)) {
    return T::staticMethod(i);
}

在C++14中,您可以跳过decltype

代码语言:javascript
复制
auto methodTemplate(int i) {
    return T::staticMethod(i);
}
票数 2
EN

Stack Overflow用户

发布于 2016-10-13 21:25:05

此工作(http://ideone.com/6pczX3):

代码语言:javascript
复制
decltype(T::staticMethod(int)) methodTemplate(int i) {
    return T::staticMethod(i);
}

起初,我认为您可能只需要适当地添加typename,但这是行不通的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40031233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档