防止某人意外地做某事

Keep somebody from doing something by accident

本文关键字:意外 某人      更新时间:2023-10-16

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

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调用。在调用函数 Second 之前,必须调用一次函数 First。您不需要手动调用函数 Second。因此,在某处使用fun_ptr之前,我们唯一应该做的是:

fn_ptr = First<SomeType>;

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

fn_ptr = Second<SomeType>;

ps:我知道当函数First和函数Secondtemplate function时该怎么做

在不详细介绍的情况下,我将使用类和fn_ptr = ...将成为一种功能。然后在函数中,您可以测试fn_ptr是否仍然是 NULL,那么 rhs 必须是可动态铸造到第一个类的。

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

最后我设法让它工作。只需将这两个函数设置为类模板的静态成员函数:

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标准,但我想它是便携式的。