让别人不小心做某事

时间:2012-12-15 01:57:50

标签: c++

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

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

时如何做

2 个答案:

答案 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标准,但我想它是可移植的。