Variadic模板候选人无与伦比

我试图将泛型方法调用器(用于C ++ OO / v8桥)放在一起,使用可变参数模板元编程构建参数列表,转换为本机类型,并最终执行附加方法,一旦传入参数列表为空(并因此建立传出):

template<typename... PARAMS>
class InvocationBuilder {
public:

void invoke(const Arguments &source, PARAMS&... params) {
    cout << "Invoke" << endl;
    (instance->*(method))(*params...);
}

template<class HEAD, class ... TAIL>
void invoke(const Arguments &source, PARAMS... params) {
    cout << "Expand" << endl;
    Type<HEAD> param(source[sizeof...(PARAMS)]);
    InvocationBuilder<PARAMS..., HEAD> builder;
    builder.template invoke<TAIL...>(source, params..., *param);
}

Type类仅仅是一个用于创建栈范围的v8参数变体的包装器(例如,在调用期间,可以在范围内使用char *字符串,但是一旦调用返回就自动清除)。

现在,当实际网桥用一个参数列表调用它时,使用:

InvocationBuilder<> builder;
builder.template invoke<ARGS...>(args);

其中args是v8 :: Arguments引用。

编译器正确链接参数生成的每一步,但无法匹配非模板化的invoke()方法,以实际执行本机C ++方法。

错误消息如下所示:

include/link/function.hh: In member function 'void sjs::link::InstanceFunctionVariadic<CLASS, ARGS>::InvocationBuilder<PARAMS>::invoke(const v8::Arguments&, PARAMS ...) [with HEAD = int, TAIL = {}, PARAMS = {int, int}, CLASS = SomeClass, ARGS = {int, int, int}]':
include/link/function.hh:65:6:   recursively instantiated from 'void sjs::link::InstanceFunctionVariadic<CLASS, ARGS>::InvocationBuilder<PARAMS>::invoke(const v8::Arguments&, PARAMS ...) [with HEAD = int, TAIL = {int}, PARAMS = {int}, CLASS = SomeClass, ARGS = {int, int, int}]'
include/link/function.hh:65:6:   instantiated from 'void sjs::link::InstanceFunctionVariadic<CLASS, ARGS>::InvocationBuilder<PARAMS>::invoke(const v8::Arguments&, PARAMS ...) [with HEAD = int, TAIL = {int, int}, PARAMS = {}, CLASS = SomeClass, ARGS = {int, int, int}]'
include/link/function.hh:47:5:   instantiated from 'v8::Handle<v8::Value> sjs::link::InstanceFunctionVariadic<CLASS, ARGS>::run(const v8::Arguments&) [with CLASS = SomeClass, ARGS = {int, int, int}]'
test.cc:41:1:   instantiated from here
include/link/function.hh:65:6: error: no matching function for call to 'sjs::link::InstanceFunctionVariadic<SomeClass, int, int, int>::InvocationBuilder<int, int, int>::invoke(const v8::Arguments&, int&, int&, int)'
include/link/function.hh:65:6: note: candidate is:
include/link/function.hh:61:10: note: template<class HEAD, class ... TAIL> void sjs::link::InstanceFunctionVariadic<CLASS, ARGS>::InvocationBuilder::invoke(const v8::Arguments&, PARAMS ...) [with HEAD = HEAD, TAIL = {TAIL ...}, PARAMS = {int, int, int}, CLASS = SomeClass, ARGS = {int, int, int}]

该消息清楚地表明,对于C ++实例方法void test(int a,int b,int c),前三个步骤正常工作,使用Type提取参数并传递结果 - 但我无法工作为什么最终的invoke()没有被正确使用。

我试图完全专门化它,但是然后我得到关于名称空间范围之外的特化的错误消息(我认为这是因为该方法是模板类的成员)。

我也尝试移动传入/传出参数列表,以便传入是在类variadic模板中,而传出的方法专门调用类的调用 - 但我遇到了“抱歉,未实现”消息将可变参数解包到静态模板中。

我也尝试过使用通用的单个可变参数模板来解决这个问题,然后专门研究HEAD / TAIL案例,专门研究空集案例,但后来我立即发现模糊(可能是因为HEAD / TAIL值实际上不是实际的作为参数传递 - 仅在模板中传递)。

但到目前为止,没有骰子。 任何人有任何其他想法,或可以解释我要去哪里错了?


注意:

  • 你明确地尝试调用一个模板
  • 您的模板化invoke始终要求PARAMS...作为函数参数传递
  • 一种可能的选择:

    #include <functional>
    
    template<class... Types> struct List {};
    
    template<class... PARAMS> struct Invoker {
        typedef std::function<void (PARAMS&...)> Fn;
        Fn fn_;    
        Invoker(const Fn&& fn) : fn_(fn) {}
    
        void invoke(List<>, PARAMS&... params) {
            fn_(params...);
        }
    
        template<class HEAD, class... TAIL, class... ARGS>
        void invoke(List<HEAD, TAIL...>, ARGS... params) {
            HEAD param; // or your Type<HEAD> ... etc.
            invoke(List<TAIL...>(), params..., param);
        }
    };
    
    void f(int, int, int) {} // some function you want to call
    
    int main() {
        Invoker<int,int,int> inv(&f);
        inv.invoke(List<int,int,int>());
    }
    

    ......没有你的用例的一个小的可编译的例子(使用虚拟类型等),使它与你的代码更紧密地匹配会花费一些时间。

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

    上一篇: Variadic template candidate unmatched

    下一篇: C++ Templates variadic but static