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

3

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

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

这个想法的背后是通过getter使它们易于从类外部访问。

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

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

    SomeType SomeMethod( SomeType1 arg1, SomeType2 arg2 ) { }

    // Data members
private:
};
2个回答

5

对于返回类型,您可以使用 decltype

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

在参数方面,您需要一个帮助器trait。它也可以用于返回类型,如下所示:

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和旧式可变参数函数)。

感谢您的明确回答和精妙技巧。但是我遇到了以下错误:错误-在'SomeClass'中没有名为'SomeMethod'的成员 错误-非友元类成员'ReturnType'不能有限定名称 错误- typedef声明符不能被限定 错误-在声明列表末尾需要';',我在这种情况下不理解。 - Athanase
2
Helper<&SomeClass::SomeMethod>::ReturnType 看起来不对。可能应该是 Helper<decltype(&SomeClass::SomeMethod)>::ReturnType - Simple
不错的更正。但是,为什么我一定要在SomeClass中声明SomeMethod之后才能声明我的typedef - Athanase
@Athanase 是因为编译器还没有看到这个类型。 - Simple
抱歉,这是一个虚拟问题。 - Athanase
@简单的感谢,已修复。 - Angew is no longer proud of SO

1
你可以使用 std::type_info 对象(通过 typeid 操作符 构造)表示类型,并使用 std::type_index 存储它们。
例如,你可以这样做:
auto ret_type = std::type_index(typeid(ProcRetType));

ProcRetType存储在变量中。

由于std::type_index既是可复制构造的,也是可复制可赋值的,因此您还可以将它们存储在像std::vector这样的容器中。例如:

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

谢谢您的回答。我没有提到我想在编译时执行此操作。使用类似于 typedef decltype(SomeClass::SomeMethod) ProcRetType; 的东西。 - Athanase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接