获取没有对象的成员函数的返回类型

时间:2011-04-07 11:24:49

标签: c++ templates c++11 decltype

我有很多我无法修改的课程。每个都有一个复制构造函数,至少一个其他构造函数,以及一个返回一些值的函数foo()。我想创建一个可以从这些类中派生出来的类模板,并且有一个与返回类型foo()类型相同的数据成员(对不起,如果我的某些术语有误)。

换句话说,我想要一个类模板

template<typename T> class C : public T
{
  footype fooresult;
};

其中footypeT::foo()的返回类型。

如果基类都有一个默认构造函数,我可以做

decltype(T().foo()) fooresult;

(使用GCC中的C ++ 0x功能)但除了复制构造函数之外,这些类没有任何特定的构造函数。

GCC也不允许decltype(this->foo()),虽然显然有可能将其添加到C ++ 0x标准中 - 有人知道这有多大可能吗?

我觉得应该可以按照decltype(foo())decltype(T::foo())的方式执行某些操作,但这些似乎不起作用:GCC会出现cannot call member function 'int A::foo()' without object形式的错误。

当然,我可以有一个额外的模板参数footype,甚至是T类型的非类参数,但是有什么方法可以避免这种情况吗?

2 个答案:

答案 0 :(得分:58)

你不需要 - 记住,因为decltype不评估它的参数,你可以只调用nullptr

decltype(((T*)nullptr)->foo()) footype;

答案 1 :(得分:39)

另一种选择是:

#include <utility>

template<typename T> class C : public T
{
   decltype(std::declval<T>().foo()) footype;
};

declval返回T&&。或者,如果foo可能会被rvalue-ref限定符重载,并且您希望确保获得foo的左值重载:

   decltype(std::declval<T&>().foo()) footype;

在此示例中,declval返回T&

((T*)nullptr)->解决方案一样,std::declvalT类型没有要求。

相关问题