2012-07-05 136 views
2

我想使用指向成员函数的决策消除进程所消耗的进程。我需要提供用户选项来打开或关闭在有限连续域上定义的函数的域检查。指向模板类中成员函数的指针

没有使用模板时,可以使用指向成员函数的指针。但是在这里我必须概括我的实现。

具体地说我在我的类三个成员函数:

1. value是一个成员函数返回由function指向部件计算出的值。 function是一个函数指针,指向checkedValueuncheckedValue。 2. checkedValue是一个成员函数,用于在输入处于指定范围内时计算并返回结果。否则会抛出一个std :: domain错误。 3. uncheckedValue计算并返回结果,与域无关。

template <typename T> 
class IO 
{ 
private: 
    typedef T (IO<T>::*functionPtr)(const std::string& name, const T& input) const; 
    functionPtr function; 
    bool domainValidation; 
    void setDomainValidation(const bool& value); 
    //... 
public: 
    // ... 
    T value(const std::string& name, const T& input) const; 
    T uncheckedValue(const std::string& name, const T& input) const; 
    T checkedValue(const size_t& index, const T &input) const; 
}; 

// Implementation: 

template <typename T> 
void IO<T>::setDomainValidation(const bool &value) 
{ 
    domainValidation = value; 
    if(domainValidation) 
    { 
     // function points to checkedValue() 
     function = & IO<T>::checkedValue; // Here I got undefinded reference error 
    } 
    else 
    { 
     // function points to uncheckedValue() 
    } 
} 

template <typename T> 
T IO<T>::value(const string &name, const T &input) const 
{ 
    return (this->*function)(name,input); 
} 

template <typename T> 
T IO<T>::uncheckedValue(const string &name, const T &input) const 
{ 
    // simply calculate and return the result 
} 

template <typename T> 
T IO<T>::checkedValue(const string &name, const T &input) const 
{ 
    // if input is in domain, calculate and return the result 
    // else throw a std::domain error 
} 
+0

确切的错误是什么? – Shahbaz 2012-07-05 13:19:42

+0

为什么不干脆......值(...) { 如果(domainValidation)返回的CheckedValue(...) 否则返回uncheckedValue(...) } – MadScientist 2012-07-05 13:22:22

+0

@MadScientist,因为后来他要重用的功能没有每次都做'if'。 – Shahbaz 2012-07-05 13:27:05

回答

3

你的函数签名

T checkedValue(const size_t& index, const T &input) const; 

但不

T IO<T>::checkedValue(const string &name, const T &input) const; 

注意多种类型的第一参数之间的差异。

+0

函数在'IO '里面,所以不行! – Shahbaz 2012-07-05 13:20:11

+0

@Shanbaz,那又如何?尝试添加类T checkedValue(const std :: string&name,const T&input)const {return T(); }并删除T IO :: checkedValue(常量字符串&名称,常量T&输入)常量不在类中,并看到结果。 – ForEveR 2012-07-05 13:23:59

+0

糟糕!我宣布他们但没有实施!让我觉得虚假,因为我花了最后2个小时这样一个简单的错误: -/ – 2012-07-05 13:35:47

4

这看起来像一个错字对我说:函数指针的函数签名是

...(const std::string &, const T &) ... 

的CheckedValue的签名是

...(const size_t &, const & T) ... 

如果签名改为函数指针匹配,代码示例为我编译。关于性能:您是否确定(在配置文件或查看程序集时)value-method中的简单if-子句比通过函数指针的(可能)间接性更差?很明显,调用checked或uncheckedValue不能被内联。

+0

+1更清晰的答案。另外,我必须同意,除非你测量它,否则你不知道'if'是更好还是函数指针间接。 – Shahbaz 2012-07-05 13:53:24

+0

你说得对。如果没有基准应用程序,我不能说它肯定会更快。但更具体的派生类可能会有更复杂的决定,他们只会申请一次。 (在配置阶段可能会有超过10个if-then子句)。另外,我不知道应该在IO中使用哪种数据类型。它可能是一个昂贵的比较运算符矩阵。 – 2012-07-05 14:26:51