确定未定义函数的参数类型

我最近了解到,我不能:

  • 取一个未定义函数的地址
  • 将模板化函数的地址与无法编译的类型相结合
  • 但我最近也了解到,我可以调用decltype来获取所述函数的返回类型

    所以一个未定义的函数:

    int foo(char, short);
    

    我想知道是否有一种方法可以将参数类型与tuple类型进行匹配。 这显然是一个元编程问题。 我在这个例子中拍摄的东西就像decltypeargs

    enable_if_t<is_same_v<tuple<char, short>, decltypeargs<foo>>, int> bar;
    

    任何人都可以帮我理解decltypeargs是如何制作的?


    对于非重载函数,指向函数的指针以及指向成员函数的指针,只需执行decltype(function)即可在decltype(function)评估的上下文中为您提供该函数的类型,并且该类型包含所有参数。

    因此,要将参数类型作为元组来获取,您只需要进行大量的特化:

    // primary for function objects
    template <class T>
    struct function_args
    : function_args<decltype(&T::operator()>
    { };
    
    // normal function
    template <class R, class... Args>
    struct function_args<R(Args...)> {
        using type = std::tuple<Args...>;
    };
    
    // pointer to non-cv-qualified, non-ref-qualified, non-variadic member function
    template <class R, class C, class... Args>
    struct function_args<R (C::*)(Args...)>
    : function_args<R(Args...)>
    { };
    
    // + a few dozen more in C++14
    // + a few dozen more on top of that with noexcept being part of the type system in C++17
    

    接着就,随即:

    template <class T>
    using decltypeargs = typename function_args<T>::type;
    

    这要求你写decltypeargs<decltype(foo)>


    使用C ++ 17,我们将有template <auto> ,所以上面可以是:

    template <auto F>
    using decltypeargs = typename function_args<decltype(F)>::type;
    

    你会得到decltypeargs<foo>语法。

    链接地址: http://www.djcxy.com/p/35465.html

    上一篇: Determining the Parameter Types of an Undefined Function

    下一篇: Intern method concept confusion as output changed with different version