将C ++ 11开关与MinGW工具链一起使用:
我想设置一个通用的事件处理程序,它会将指针参数(引用也很好)发送到我可能想要的任何类型的类。
使用泛型类指针作为参数声明函数指针的正确语法是什么?
我试过了:
typedef void ( *OnChange ) ( class* );
编译器错误:
typedef'OnChange'已初始化(使用decltype代替)
我不熟悉decltype(),从我读到的内容来看,它不是我需要的。
我也尝试过:
typedef void ( *OnChange ) ( auto* );
编译器错误:
参数声明为'auto'
我认为这意味着auto不能用于参数声明。
我应该如何声明typedef? (或者我可能需要做些不同的事情?)
答案 0 :(得分:3)
C ++是一种静态类型语言。尽管像auto
和模板这样的功能可能会让您不这么认为,但C ++编译器必须在编译时知道系统中所有内容的类型。 auto
和模板允许它在某些情况下推断类型,但这只有在编译器确实知道该类型是什么时才会这样。
C ++中没有“泛型类指针”这样的东西。每个指针必须是指向显式类型的指针。指向一种类型的每个指针都是与指向其他类型的指针根本不同的类型。 C ++不认为指向不同类型的指针是可以互换的(尽管它允许一些隐式转换,例如从指针到void*
的转换)。
你需要的不是函数指针;指针必须具有显式类型,并且您需要保存不是显式类型的内容。你需要的是一个仿函数;这是有效的,因为operator()
方法可以是模板。但是,这将要求您使包含此仿函数的类成为模板(仿函数的类型由用户作为模板参数传入),或者您需要使您的类使用类型擦除技术,以便它可以调用用户传入和注册的任何仿函数值。
后者需要像std::function
这样的东西,只需要一个任意的,模板化的operator()
函数调用,而不是一个具体的类型函数。
答案 1 :(得分:2)
我认为你可以使用这样的东西:
template<typename T>
struct X{
typedef void (*OnChange) ( T* );
};
void foo(int* ptr){
}
class Test;
int main(){
int a=12;
X<int>::OnChange ptr= foo;
ptr(&a);
X<Test>::OnChange o;
}
答案 2 :(得分:0)
模板typedef可以使用C ++ 11编译器使用语法:
template < typename T >
using OnChange = void (*)( T * );