【问题标题】:Storing return type and arguments type of a method存储方法的返回类型和参数类型
【发布时间】:2014-03-05 10:25:23
【问题描述】:

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

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

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

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

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

    SomeType SomeMethod( SomeType1 arg1, SomeType2 arg2 ) { }

    // Data members
private:
};

【问题讨论】:

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


    【解决方案1】:

    对于返回类型,你可以使用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 和旧式可变参数函数,如果这适用于您的话)。

    【讨论】:

    • 感谢您的明确回答和不错的技术。但我收到以下错误:Error - no member named 'SomeMethod' in 'SomeClass' Error - non-friend class member 'ReturnType' cannot have a qualified name Error - typedef declarator cannot be qualified Error - expected ';' at end of declaration list 在那种情况下我不明白。
    • Helper&lt;&amp;SomeClass::SomeMethod&gt;::ReturnType 看起来不对。应该是Helper&lt;decltype(&amp;SomeClass::SomeMethod)&gt;::ReturnType。
    • 很好的修正。但是,为什么我必须在SomeClass 中声明SomeMethod 之后声明我的typedefs?
    • @Athanase 因为编译器还没有看到类型。
    • 假问题,抱歉。
    【解决方案2】:

    您可以用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));
    // ...
    

    【讨论】:

    • 感谢您的回答。我没有提到我想做一个编译时间。像typedef decltype(SomeClass::SomeMethod) ProcRetType;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多