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

我有一些我不能修改的类。 每个都有一个拷贝构造函数,至less有一个其他的构造函数和一个返回值的函数foo() 。 我想创build一个可以从这些类派生出来的类模板,并且有一个与foo()的返回types相同types的数据成员(抱歉,如果我有一些术语错误)。

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

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

footypeT::foo()的返回types。

如果基类都拥有默认的构造函数,我可以这样做

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

(在GCC中具有C ++ 0xfunction),但除了复制构造函数之外,类没有任何特殊的构造函数。

GCC也不允许decltype(this->foo()) ,尽pipe显然有可能这将被添加到C ++ 0x标准 – 有谁知道这是多么可能吗?

我觉得应该可以沿着decltype(foo())decltype(T::foo())的方式来做一些事情,但这些似乎不起作用:GCC给出了一个错误,表单cannot call member function 'int A::foo()' without object

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

你不需要那个 – 记住,因为decltype不评估它的参数,所以你可以调用nullptr

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

另一种select是:

 #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)->解决scheme一样, std::declval对typesT没有要求。