2

メンバー関数へのポインターを使用した決定によって消費されるプロセスを排除したい。制限された継続ドメインで定義された関数のドメイン チェックをオンまたはオフにするユーザー オプションを提供する必要があります。

テンプレートを使用しない場合は、メンバー関数へのポインターを使用してもかまいません。しかし、ここで実装を一般化する必要があります。

具体的には、クラスに 3 つのメンバー関数があります。

1.valueメンバー関数は、functionポイントするメンバーによって計算された値を返します。は、 または のいずれかfunctionを指す関数ポインタです。2.入力が指定された範囲内にある場合、計算して結果を返すメンバー関数です。それ以外の場合は std::domain エラーがスローされます。3.ドメインに関係なく、結果を計算して返します。checkedValueuncheckedValuecheckedValueuncheckedValue

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
}
4

2 に答える 2

3

あなたの関数には署名があります

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

だがしかし

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

最初のパラメーターの型の違いに注意してください。

于 2012-07-05T13:19:22.620 に答える