指向模板类中成员函数的指针

Pointer to member function in template class

本文关键字:成员 函数 指针      更新时间:2023-10-16

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

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

具体来说,我的类中有三个成员函数:

1. value 是一个成员函数,返回由function指向的成员计算的值。function是一个指向checkedValueuncheckedValue的函数指针。2. checkedValue 是一个成员函数,如果输入在指定范围内,则计算并返回结果。否则会抛出 std::d omain 错误。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
}

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

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

checkedValue 的签名是

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

如果更改签名以匹配函数指针,则代码示例将为我编译。关于性能:你确定(如已经分析或查看程序集)值方法中的简单 if 子句比通过函数指针的(可能的)间接寻址更差吗?显然,对已检查或未选中值的调用不能内联。

你的函数有签名

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

但不是

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

请注意第一个参数的类型之间的差异。