是否可以在编译时使用SomeMethod
确定并存储decltype
的返回类型(如果这是最好的方法,那么最好的方法是什么)?
是否也可以使用相同的工具来存储SomeMethod
的参数的类型列表?
这背后的想法是使用getter从类外部轻松访问它们。
class SomeClass
{
public:
typedef [???] ProcRetType;
typedef [???] ProcArgTypeList;
public:
SomeClass() { }
~SomeClass() noexcept { }
SomeType SomeMethod( SomeType1 arg1, SomeType2 arg2 ) { }
// Data members
private:
};
答案 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
同时是CopyConstructible和CopyAssignable,您还可以将它们存储在std::vector
等容器中。例如:
std::vector<std::type_index> vec;
vec.emplace_back(typeid(int));
vec.emplace_back(typeid(double));
// ...