指向模板类中成员函数的指针
Pointer to member function in template class
我想消除使用指向成员函数的指针的决策所消耗的进程。我需要为用户提供选项,以打开或关闭在有限连续域上定义的函数的域检查。
不使用模板时,可以使用指向成员函数的指针。但在这里我必须概括我的实现。
具体来说,我的类中有三个成员函数:
1. value
是一个成员函数,返回由function
指向的成员计算的值。function
是一个指向checkedValue
或uncheckedValue
的函数指针。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;
请注意第一个参数的类型之间的差异。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法