【问题标题】:Pointer to member function in template class指向模板类中成员函数的指针
【发布时间】:2012-07-05 21:39:37
【问题描述】:

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

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

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

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
}

【问题讨论】:

  • 确切的错误是什么?
  • 为什么不简单... value(...) { if (domainValidation) return checkedValue(...) else return uncheckedValue(...) }
  • @MadScientist,因为后来他想重用该功能,而不是每次都执行if
  • @MadScientist 因为value 将被调用数百万次!我不想浪费时间检查domainValidation,它只设置一次(启动时间)。

标签: c++ templates function-pointers


【解决方案1】:

你的函数有签名

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

但不是

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

注意第一个参数类型的区别。

【讨论】:

  • 函数在IO&lt;T&gt;里面,所以没有!
  • @Shanbaz,那又怎样?尝试添加类 T checkedValue(const std::string& name, const T& input) const { return T(); } 并删除 T IO::checkedValue(const string &name, const T &input) const not in class 并查看结果。
  • 糟糕!我已经宣布了它们,但没有实施!让我感觉很傻,因为我在这么简单的故障上花了最后 2 个小时:-/
  • @ForEveR,我没有注意到您指出了第一个参数类型的差异!通过快速扫描,我发现只有IO&lt;T&gt; 有区别。
【解决方案2】:

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

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

checkedValue 的签名是

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

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

【讨论】:

  • +1 以获得更清晰的答案。另外,我必须同意,除非你测量它,否则你无法知道if 是更好还是函数指针间接。
  • 你是对的。如果没有基准测试应用程序,我不能说它肯定会更快。但是更具体的派生类可能有更复杂的决定,它们只会应用一次。 (配置阶段可能有十多个 if-then 子句)。此外,我不知道应该在 IO 中使用哪种数据类型。它可能是一个带有昂贵的比较运算符的矩阵。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
  • 2011-12-09
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多