如何将函数名称作为编译时参数传递?

时间:2015-07-26 16:46:00

标签: c++ templates metaprogramming

到目前为止,我已经能够通过名称检测某个函数是否存在,而不需要其签名,如下所示:

严格遵循一段代码"启发"通过这个问题的答案:Is it possible to figure out the parameter type and return type of a lambda?

我知道应该为不同的修饰符创建不同的专门化,例如const成员函数。

template <typename T, typename TReturn, typename... Args>
struct function_traits<TReturn( T::* )( Args... )>
{
    using return_type = TReturn;
    using arguments = std::tuple<Args...>;

    static std::size_t constexpr arg_count = sizeof...( Args );

    template <std::size_t N, typename = void>
    struct argument
    {
        using type = std::tuple_element_t<N, arguments>;
    };

    template <std::size_t N>
    struct argument<N, std::enable_if_t<( !( N < arg_count ) ), void>> {};
};

我自己的代码作为 28.4.4 C ++编程语言,第4版的解决方法,因为我使用 VC ++ 2015

template <typename T>
struct has_func_f
{
private:
    template <typename C, typename = void>
    struct get_result
    {
        static bool constexpr value = false;
    };

    // need <function_name> as a class parameter so I can append and get &C::<function_name>
    template <typename C>
    struct get_result<C, std::enable_if_t<( std::is_same<decltype( ( decltype( std::declval<typename function_traits<decltype( &C::f )>::arguments>() ) ) ( std::declval<typename function_traits<decltype( &C::f )>::arguments>() ), std::true_type() ), std::true_type>::value ), void>>
    {
        static bool constexpr value = true;
    };

public:
    static bool constexpr value = get_result<T>::value;
};

只要名称匹配,此代码就可用于检测任何函数签名。我的示例用法:

struct A {};
struct B { float f(int, double); };
struct C { void f(); };

int main()
{
    has_func_f<A>::value; // false
    has_func_f<B>::value; // true
    has_func_f<C>::value; // true

    return 0;
}

正如我的问题所述,我怎么可能做我想做的事情?我已经查看并查看了,我最接近的是使用宏来为我想要的函数名生成适当的结构。还有其他办法吗?

0 个答案:

没有答案
相关问题