Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++;lambda到c函数_C++_Templates_C++11_Function Pointers_Word Wrap - Fatal编程技术网

C++ 有关转换c++;lambda到c函数

C++ 有关转换c++;lambda到c函数,c++,templates,c++11,function-pointers,word-wrap,C++,Templates,C++11,Function Pointers,Word Wrap,更新2 好的,解决了第二个问题。正如前面指出的,我在尝试将ReturnType(Args…与ReturnType(*)(Args…)匹配时遇到了一个冲突错误。显而易见的解决办法是: template <typename F, F *fn> void doSomething() { function_helper<F>::template toNative<fn>(); } 模板 无效剂量测定法(){ 函数_helper::template toNat

更新2

好的,解决了第二个问题。正如前面指出的,我在尝试将
ReturnType(Args…
ReturnType(*)(Args…)
匹配时遇到了一个冲突错误。显而易见的解决办法是:

template <typename F, F *fn>
void doSomething() {
    function_helper<F>::template toNative<fn>();
}
模板
无效剂量测定法(){
函数_helper::template toNative();
}
现在它在clang++下编译

更新

正如前面指出的,我以前的代码有一个问题,我试图将函数参数传递给模板参数。但是,解析错误的陌生人错误隐藏了这一点。错误地传递函数参数不应该导致我看到的错误

原来问题在于调用类的模板成员函数的新语法(请参阅)

正确的语法应为:

template <typename F, F *fn>
void doSomething() {
  native_function native = function_helper<decltype(fn)>::template toNative<fn>();
}
模板
无效剂量测定法(){
native_function native=function_helper::template toNative();
}
其中必须在“::”和函数之间插入模板

不幸的是,这是一个非常困难的搜索问题,因为:(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);
        };
    }
};
模板
结构函数_helper{};
模板
结构函数{
//将实际函数包装在本机c函数中(允许调用它
//通过外部脚本语言(API)
模板
静态本机函数toNative(){
返回[](状态*状态)->int{
上下文ctx(状态);
返回apply\u helper::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>());
}
模板
本机函数(上下文和ctx,常量std::字符串和名称,返回类型(*fn)(参数…){
registerFn(名称,函数_helper::toNative());
}
然而,这给了我一个“解析错误”。如果我不尝试将其包装到函数中,而是:

int main(int argc, char **argv) {
    // ...
    ctx.registerFn("myFunc", function_helper<decltype(myFunc)>::toNative<myFunc>());
}
int main(int argc,char**argv){
// ...
registerFn(“myFunc”,function_helper::toNative());
}
一切都能正确编译和运行。同样,如果我使用宏,它也可以工作。然而,出于设计原因,我更愿意使用函数

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

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);
    };
}
模板
结构函数_args{};
模板
结构函数参数{
常量int size=sizeof…(Args);
};
模板
本机函数wrap(){
返回[](状态*状态)->int{
上下文ctx(状态);
返回apply\u helper::apply(ctx,fn);
};
}
我是做错了什么,还是编译器出了问题?解析错误让我怀疑是编译器出了错

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


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

这里是2009年的同一个问题:。显然,decltype取代了BOOST_TYPEOF,但至少当时唯一的解决方案是使用宏。
decltype(fn)
应该是函数指针类型,它与您的部分专门化不匹配。您可以尝试使用
decltype(*fn)
。我不知道这是否是您的实际问题。
fn
是一个函数参数,不能用作模板参数。另外,
decltype(fn)
ReturnType(*)(Args…
),您的部分专业化不会匹配它。只需使用
函数\u helper
,尽管由于我的第一句话,这不会有帮助。@Xeo-Yup,说得好。我早该抓到的。有没有关于如何解决这个问题的建议,或者我被宏卡住了?另外,如果你把你的评论作为一个答案,我可以接受。如果你的意思是不必以某种方式指定函数类型,那么,唉,不,除了宏之外没有其他方式。