存储方法的返回类型和参数类型

时间:2014-03-05 10:25:24

标签: c++ c++11 compile-time decltype

是否可以在编译时使用SomeMethod确定并存储decltype的返回类型(如果这是最好的方法,那么最好的方法是什么)?

是否也可以使用相同的工具来存储SomeMethod的参数的类型列表?

这背后的想法是使用getter从类外部轻松访问它们。

class SomeClass
{
public:
    typedef [???] ProcRetType;
    typedef [???] ProcArgTypeList;

public:
    SomeClass() { }
    ~SomeClass() noexcept { }

    SomeType SomeMethod( SomeType1 arg1, SomeType2 arg2 ) { }

    // Data members
private:
};

2 个答案:

答案 0 :(得分:5)

对于返回类型,您只需使用decltype

typedef decltype(SomeMethod(std::declval<SomeType1>(), std::declval<SomeType2>())) ProcRetType;

对于参数,您需要一个辅助特征。这也可以用于返回类型,如下所示:

template <class Func>
struct Helper;

template <class T, class R, class... Arg>
struct Helper<R (T::*)(Arg...)>
{
  typedef std::tuple<Arg...> ArgTypes;
  typedef R ReturnType;
};

然后像这样使用它:

typedef Helper<decltype(&SomeClass::SomeMethod)>::ReturnType ProcRetType;
typedef Helper<decltype(&SomeClass::SomeMethod)>::ArgTypes ProcArgTypeList;

我正在使用std::tuple来表示类型列表 - 其他表示也是可能的,例如Boost.MPL

如果适用于您,您可能需要提供Helper的一些其他部分特化以考虑const函数(可能还有volatile和旧式可变参数函数)。

答案 1 :(得分:1)

您可以使用std::type_info个对象(通过typeid operator构建)来表示类型,并将其存储为std::type_index

作为一个例子,你可以这样做:

auto ret_type = std::type_index(typeid(ProcRetType));

ProcRetType存储在变量中。

由于std::type_index同时是CopyConstructibleCopyAssignable,您还可以将它们存储在std::vector等容器中。例如:

std::vector<std::type_index> vec;
vec.emplace_back(typeid(int));
vec.emplace_back(typeid(double));
// ...