迭代function_traits参数

时间:2015-08-16 15:07:00

标签: c++ templates c++11 template-meta-programming

我试图做一些"模板元编程"将c ++函数暴露给python更容易的东西。我想做的是获取现有函数并生成一个字符串,其中包含有关其返回类型和参数的信息(typeinfo也可以。)

我使用了基于(被盗)this wordpress article的函数特征类,而不是硬编码访问前几个参数我想迭代它们。

我认为我需要创建一个模板函数,它为参数索引取一个size_t值(因为它必须是常量),但那是我丢失的地方。

我已经编写了一些代码,但我无法在最基本的情况下使用它(更不用说我之后的一般情况了。)

// The stolen function_traits struct...thing
template<typename T>
struct function_traits;

template<typename R, typename ...Args>
struct function_traits<std::function<R(Args...)>>
{
    static const size_t nargs = sizeof...(Args);

    using result_type = R;

    template <size_t i>
    struct arg
    {
        using type = typename std::tuple_element<i, std::tuple<Args...>>::type;
    };
};

// The function of interest
int foo(float x) {
    return int(x);
}

// Recurse until one argument is left, appending the type name
// to the referenced string being passed in
template<size_t argIdx, typename R, typename ... Args>
void getArgTypes(std::string& ref) 
{
    using fun = function_traits<std::function<R(Args...)> >;
    if (argIdx == 1)
        ref.append(typeid(fun::arg<0>).name()).append("\n");
    else {
        ref.append(typeid(fun::arg<argIdx-1>).name()).append("\n");
        getArgTypes<argIdx - 1, R, Args...>(ref);
    }
}

// My test of the template function
void test() {
    std::string f = "";

    // What I'd like to do
    using fun = function_traits<std::function<decltype(foo)> >;
    getArgTypes<fun::nargs, fun::result_type, ? ? ? >;

    // But I can't even do this!
    getArgTypes<1, float, int>(f);
}

在第一种情况下,我在调用getArgTypes时使用我的function_traits结构,我不知道指定什么作为... Args模板参数。在第二种情况下,MSVC抛出错误:

Error   C1202   recursive type or function dependency context too complex

我对这个元编程/可变参数模板的全新内容很抱歉,如果这是一个愚蠢的问题。如果有一个不那么迂回的解决方案,我也会感兴趣。

感谢您阅读!

0 个答案:

没有答案