メンバー関数へのポインターを使用した決定によって消費されるプロセスを排除したい。制限された継続ドメインで定義された関数のドメイン チェックをオンまたはオフにするユーザー オプションを提供する必要があります。
テンプレートを使用しない場合は、メンバー関数へのポインターを使用してもかまいません。しかし、ここで実装を一般化する必要があります。
具体的には、クラスに 3 つのメンバー関数があります。
1.value
メンバー関数は、function
ポイントするメンバーによって計算された値を返します。は、 または のいずれかfunction
を指す関数ポインタです。2.入力が指定された範囲内にある場合、計算して結果を返すメンバー関数です。それ以外の場合は std::domain エラーがスローされます。3.ドメインに関係なく、結果を計算して返します。checkedValue
uncheckedValue
checkedValue
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
}