Lambda函数无法调用函数模板参数的静态函数
Lambda function failing to call static functions of a function template parameter
好的,我的设置基本上是这样的:
template<typename T> void example()
{
std::function<int (byte*)> test = [=](byte* start) -> int
{
return T::magic(start);
}
}
忽略这些裸调用有多"不干净",它也不会编译,给出以下错误:
'T' : is not a class or namespace name
'magic': identifier not found
是否有任何方法可以对泛型类型名T进行调用,假设我将始终使用具有函数magic(byte* start)的类调用example() ?当然,我不需要为每个将要这样做的类重新声明这个模板函数。
我在vc++ 2010中这样做,它似乎可能是一个编译器错误。有什么可行的变通办法吗?
唯一的错误是缺少分号。一旦这个问题解决了,它就可以正常工作了。
#include <iostream>
#include <functional>
typedef unsigned char byte;
template<typename T> void example()
{
std::function<int (byte*)> test = [=](byte* start) -> int
{
return T::magic(start);
}; // <--------------------------------- You were missing that
}
struct Foo {
static int magic(byte*);
};
int Foo::magic(byte* start)
{
std::cout << "magicn";
}
int main()
{
example<Foo>();
}
http://ideone.com/dRdpI 由于这似乎是VC10的lambda实现中的一个错误,一个可能的解决方案是创建一个局部函函数类:
template<typename T> void example()
{
struct Foo {
int operator()(byte * start) { return T::magic(start); }
};
std::function<int (byte*)> test = Foo();
}
我在VS2010中重现了这个问题。您需要调用example
函数,但是:
#include <functional>
struct SomeT { static int magic(unsigned char*) { return 42; } };
template<typename T> void example()
{
std::function<int (unsigned char*)> test = [=](unsigned char* start) -> int
{
return T::magic(start);
};
}
int main()
{
example<SomeT>();
}
根据OP的注释更新:
如此:
#include "stdafx.h"
#include <functional>
struct SomeT { static int magic(unsigned char*) { return 42; } };
template<typename T> void example()
{
auto func = T::magic;
std::function<int (unsigned char*)> test = [=](unsigned char* start) -> int
{
return func(start);
};
}
int main()
{
example<SomeT>();
}
我一直在寻找解决方案,但没有一个工作,我尝试了包括这个不错的排列,但没有运气:
template<typename T> void example()
{
static const T* workaround;
std::function<int (unsigned char*)> test = [=](unsigned char* start) -> int
{
typedef decltype(*workaround) innerT;
return innerT::magic(start);
};
}
这个很难…
我肯定你做错了什么,因为我能够调用一个静态方法使用语法T::f()
内lambda:
#include <iostream>
#include <functional>
struct A
{
static void f() { std::cout << "called" << std::endl; }
};
template<typename T>
void example()
{
std::function<void()> test = [=]() { T::f(); };
test();
}
int main() {
example<A>();
return 0;
}
Demo: http://ideone.com/IPakS
所以请发布更多的信息。直到这就是答案。试着将您的代码与此代码进行比较,看看您是否做错了什么。
如果你使用GCC,你编译你的代码与-std=c++11
选项?
相关文章:
- 将非静态函数作为参数传递时出错
- 静态函数作为类模板参数-导致可维护性问题
- boost::绑定静态函数的参数
- 授予静态函数对数据的访问权限,而不将数据作为参数传递
- Boost Python def 成员函数,它调用静态函数,其中 self 作为唯一的参数
- C++:std::bind() 如何"知道"模板参数是指静态函数还是成员函数?
- 指向可变参数模板静态函数的指针.如何
- 静态函数中的非静态参数
- 是否可以在模板类中编写一个静态可变参数模板函数,该函数能够接受 T 类型的 N 个参数?
- C++使用预定义参数调用静态函数指针
- 将参数中的静态函数指针替换为实例中方法的指针
- 正在初始化不使用零参数构造函数c++的静态类对象
- 链式静态函数调用之间的参数求值顺序
- 函数可以接受静态函数指针作为参数吗?
- Lambda函数无法调用函数模板参数的静态函数
- 如何引用一个静态函数作为参数传递
- 在c++中使用线程调用带有多个参数的非静态函数
- 如何在C++中从静态函数内部将指向静态函数的指针作为参数传递给另一个静态函数
- 如何强制派生类实现一个静态函数,该函数接收派生类的对象作为参数
- c++静态编译带有可变数量或参数的函数