Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造可变模板参数表_C++_Templates_Generic Programming_Duktape - Fatal编程技术网

C++ 构造可变模板参数表

C++ 构造可变模板参数表,c++,templates,generic-programming,duktape,C++,Templates,Generic Programming,Duktape,假设我有以下场景: namespace detail { using duk_c_function_t = std::function<duk_ret_t(duk_context*)>; template<typename T_Return(typename ... T_Params), std::function<T_Return(T_Params)> duk_ret_t duk_function_proxy(duk_context* c

假设我有以下场景:

namespace detail
{
    using duk_c_function_t = std::function<duk_ret_t(duk_context*)>;

    template<typename T_Return(typename ... T_Params), std::function<T_Return(T_Params)>
    duk_ret_t duk_function_proxy(duk_context* ctx)
    {
        const int n = sizeof...(T_Params); //real number of arguments passed.
        duk_idx_t num_arguments = duk_get_top(ctx); //Number of arguments from javascript
        int x = duk_require_int(ctx, 0); //Get integer -> parameter no 1
        const char* c = duk_require_string(ctx, 1); //Get string -> parameter no 2
    }
}
template<typename T_Return(typename ... T_Params)>
duk_c_function_t duk_function(std::function<T_Return(T_Params ...) function_item)
{
    return duk_c_function_t(detail::duk_function_proxy<function_item>);
}
名称空间详细信息
{
使用duk_c_函数\u t=std::function;
模板参数1
const char*c=duk_require_string(ctx,1);//获取字符串->参数号2
}
}
模板

duk_c_function\u t duk_function(std::function这应该可以让你开始了。我已经模拟了duk界面,因为它没有安装在我的机器上,但你会想到:

#include <iostream>
#include <string>
#include <functional>
#include <utility>

struct duk_context;

const char* duk_require_string(duk_context*, int i)
{
    static constexpr const char * strings[] = {
        "i like",
        "hairy",
        "ducks"
    };
    return strings[i];
}

int duk_require_int(duk_context*, int i)
{
    return i * 6;
}

template<class Type> auto get_arg(duk_context* ctx, int i) -> Type;

template<> auto get_arg<std::string>(duk_context* ctx, int i) -> std::string
{
    return duk_require_string(ctx, i);
}

template<> auto get_arg<int>(duk_context* ctx, int i) -> int
{
    return duk_require_int(ctx, i);
}

template<class...Args, size_t...Is>
void get_args_impl(duk_context* context, const std::function<void(Args...)>& f, std::index_sequence<Is...>)
{
    using tuple_type = std::tuple<Args...>;
    f(get_arg<std::tuple_element_t<Is, tuple_type>>(context, Is)...);
}

template<class...Args>
void get_args(duk_context* context, const std::function<void(Args...)>& f)
{
    get_args_impl<Args...>(context, f, std::index_sequence_for<Args...>());
}

void foo(std::string a, int b, std::string c)
{
    std::cout << a << " " << b << " " << c << std::endl;
}

int main()
{
    duk_context* ctx = nullptr;

    get_args(ctx, std::function<void(std::string, int, std::string)>(&foo));

    return 0;
}

我不太明白你想做什么。你能把问题简化一点吗?你想迭代Tparam,从duk_require(0…n-1)获取参数并检查它们是否都存在吗?我想迭代参数,获取并存储相应的值(在某种容器中),然后调用函数对象(作为模板参数传递)使用这些值。明白了-将在5分钟内发布解决方案。您应该首先将它们放入元组。通过递归迭代元组。@TrevorHickey设法避免了这种情况-您可以使用未实例化元组的std::tuple_元素,因为这两个参数包没有在推导的上下文中进行计算。请参见下文。我很困惑。也就是说,tempATE比我想象的要复杂得多:D@calcyss:)您将在几年内掌握诀窍是否可以将函数对象作为模板参数传递?我这样问是因为
duktape
接口只接受签名
duk_ret_t函数(duk_context*)
用于公开,我会使用
duk_函数
detail::duk_函数代理
方法检索它。你只能将类型和常量作为模板参数传递,而不能作为对象。你必须将对象作为函数参数或对象的数据成员传递。哦,糟了。那么我上面的概念就根本不起作用了是时候重新考虑一切了。。。
i like 6 ducks