2
4

3 回答 3

3

C++ 是一种静态类型语言。尽管像auto和模板之类的功能可能会让您不这么认为,但 C++ 编译器必须在编译时知道系统中所有内容的类型。auto并且模板允许它在某些情况下推断类型,但只有当编译器肯定知道该类型是什么时。

C++ 中没有“通用类指针”这样的东西。每个指针都必须是指向显式类型的指针。每个指向一种类型的指针都是与指向其他类型的指针根本不同的类型。C++ 不认为指向不同类型的指针是可互换的(尽管它确实允许一些隐式转换,例如从指针到 a 的转换void*)。

您需要的不是函数指针;指针必须具有显式类型,并且您需要保存不是显式类型的东西。你需要的是一个仿函数;之所以有效,是因为该operator()方法可以是一个模板。但是,这将要求您将持有此函子的类设为模板(函子的类型由用户作为模板参数传入),或者您需要使您的类使用类型擦除技术,以便它可以调用用户传入和注册的任何函子值。

后者std::function只需要一个任意的、模板化的operator()函数调用,而不是一个具体的、类型化的函数。

于 2013-08-31T10:39:24.030 回答
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;
 }
于 2013-08-31T10:34:54.563 回答
0

使用语法的 C++11 编译器可以使用模板 typedef:

template < typename T >
using OnChange = void (*)( T * ); 
于 2013-08-31T10:28:39.930 回答