1

我遇到的问题基本上可以通过下面的代码来解释:

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。您不需要手动调用函数 Second。所以我们之前唯一应该做的fun_ptr就是在某处使用:

fn_ptr = First<SomeType>;

问题来了:我怎样才能阻止人们这样做:

fn_ptr = Second<SomeType>;

ps:我知道functionFirst和functionSecond都没有的时候怎么办template function

4

2 回答 2

0

如果不详细介绍,我会使用类,而 fn_ptr = ... 将成为一个函数。然后在函数中您可以测试 fn_ptr 是否仍然为 NULL,那么 rhs 必须是可动态转换为第一类的。

我不太确定您是否可以做很多事情来防止错误。

于 2012-12-15T02:03:01.637 回答
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 标准,但我想它是可移植的。

于 2012-12-15T07:36:09.277 回答