我遇到的问题基本上可以通过以下代码解释:
void (*fn_ptr)();
template<typename T> void Second(){
//do something
}
template<typename T> void First() {
//do init
fn_ptr = Second<T>;
}
函数First
和函数Second
都需要template function
,并且只能通过函数指针fn_ptr
调用。在调用函数First
之前,必须调用函数Second
。你不需要手动调用功能二。因此,fun_ptr
之前我们应该做的唯一事情就是:
fn_ptr = First<SomeType>;
问题:我如何阻止人们这样做:
fn_ptr = Second<SomeType>;
ps:我知道当函数First
和函数Second
不是template function
答案 0 :(得分:0)
如果不详细说明,我会使用类,而fn_ptr = ...将成为一个函数。然后在函数中你可以测试fn_ptr是否仍然是NULL,那么rhs必须是动态可转换为第一个类。
我不太确定你能做些什么来防止错误。
答案 1 :(得分:0)
最后我设法让它发挥作用。只需使两个函数成为类模板的静态成员函数:
template<typename T> class Foo{
public:
void First() {
//do init
fn_ptr = Second<T>;
}
private:
void Second(){
//do something
}
};
然后:
fn_ptr = Foo<SomeType>::First; // OK
fn_ptr = Foo<SomeType>::Second; // Error: Second is inaccessable
我只想说冬青屎。 fn_ptr
在函数First
为其分配私有静态成员函数后运行良好。好吧,它适用于VC ++ 2012.我不知道它是否符合iso标准,但我想它是可移植的。