获取没有对象的成员函数的返回types
我有一些我不能修改的类。 每个都有一个拷贝构造函数,至less有一个其他的构造函数和一个返回值的函数foo()
。 我想创build一个可以从这些类派生出来的类模板,并且有一个与foo()
的返回types相同types的数据成员(抱歉,如果我有一些术语错误)。
换句话说,我想要一个类模板
template<typename T> class C : public T { footype fooresult; };
footype
是T::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
,甚至T
types的非类参数,但有什么办法可以避免这种情况?
你不需要那个 – 记住,因为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
没有要求。