0

更新 2

好的,解决了第二个问题。如前所述,在尝试ReturnType(Args...)匹配ReturnType (*)(Args..). 明显的解决方法是:

template <typename F, F *fn>
void doSomething() {
    function_helper<F>::template toNative<fn>();
}

它现在在 clang++ 下编译。

更新

正如所指出的,我之前的代码有问题,我试图将函数参数传递给模板参数。然而,这被解析错误的奇怪错误所掩盖。错误地传递函数参数不应该导致我看到的错误。

事实证明,问题在于调用类的模板化成员函数的新语法(请参阅http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a .doc/language/ref/keyword_template_qualifier.htm)。

正确的语法应该是:

template <typename F, F *fn>
void doSomething() {
  native_function native = function_helper<decltype(fn)>::template toNative<fn>();
}

其中必须在'::'和函数之间插入模板。

不幸的是,这是一个非常困难的问题搜索:(a)编译器错误完全没有帮助,并且(b)没有明显的搜索词可以使用。

此外,目前这似乎不适用于当前版本的 clang++,也不适用于 g++ 4.6(到目前为止,我得到另一个语法错误或内部编译器错误)。

原始问题

在我之前的问题的后续行动中,我有以下代码:

template <typename T>
struct function_helper {};

template <typename ReturnType, typename... Args>
struct function_helper<ReturnType(Args...)> {

    // wraps actual function in a native-c function (allow it to be called
    // via an external scripting language API) 
    template <ReturnType (*fn)(Args...)>
    static native_function toNative() {
         return [](State *state) -> int {
            Context ctx(state);
            return apply_helper<sizeof...(Args)>::apply(ctx, fn);
        };
    }
};

我想用它来包装:

template <typename ReturnType, typename... Args>
native_function function_(Context &ctx, const std::string &name, ReturnType (*fn)(Args...)) {
    ctx.registerFn(name, function_helper<decltype(fn)>::toNative<fn>());
}

但是,这给了我一个“解析错误”。如果我不尝试将它包装在一个函数中,而是这样做:

int main(int argc, char **argv) {
    // ...
    ctx.registerFn("myFunc", function_helper<decltype(myFunc)>::toNative<myFunc>());
}

一切都编译并正确运行。同样,如果我使用宏,它也可以工作。但是,出于设计原因,我更愿意使用函数。

我还尝试了一种稍微不同的配方,结果相同:

template <typename T>
struct function_args {};

template <typename ReturnType, typename... Args>
struct function_args<ReturnType (*)(Args...)> {
    const int size = sizeof...(Args);
};

template <typename F, F *fn>
native_function wrap() {
    return [](State *state) -> int {
        Context ctx(state);
        return apply_helper<function_args<decltype(fn)>::size>::apply(ctx, fn);
    };
}

我做错了什么,还是编译器问题?解析错误让我怀疑是编译器有问题。

我可以通过向 toNative() 添加参数来消除解析错误。但是,这只是导致了一个不同的错误,即没有这样的方法 toNative(int)。

我正在使用 xcode 附带的最新 clang++(基于 LLVM 3.1svn)。

4

0 回答 0