1

この宣言は問題ありません:

void memberFunction(T& functor, double value)noexcept(noexcept(functor(value))); 

のために

template<class T> 
class MyClass{
    public: 
        void memberFunction(T& functor, double value)noexcept(noexcept(functor(value))); 
};

MyClass に functor データ メンバーがあるとします。

template<class T> 
class MyClass{
    public: 
        //ctor 
        ... 
        void memberFunction(double value); 
    private: 
        T functor; 
};

前のケースと同じように noexcept 仕様を書きたいので、これを試しました。

void memberFunction(double value)noexcept(noexcept(functor(value))); 

しかし、コンパイラは、ファンクターがスコープではないことを教えてくれます。以下は、同様の理由で機能しません。

void memberFunction(double value)noexcept(noexcept(this->functor(value))); 

また、デフォルトのコンストラクターがない T として使用されるクラスがいくつかあるため、以下は機能しません。

void memberFunction(double value)noexcept(noexcept(T()(value))); 

以下は構文的に間違っています。

void memberFunction(double value)noexcept(noexcept(T::operator(double))); 

それは私が欲しいものを絵でよく説明していますが。

なにか提案を?とりあえず仕様は諦めました…

4

2 に答える 2

2

std::declval<T>()T右辺値インスタンス をシミュレートします。std::declval<T&>()左辺値Tインスタンスをシミュレートします。の代わりにこれを使用しT()ます。

于 2015-07-15T08:18:03.743 に答える
2

そのnoexcept仕様は宣言の一部であるためmemberFunction、後で宣言されたメンバー データにはアクセスできません。

functor簡単な修正は、上記の宣言を移動することですmemberFunction:

template<class T> 
class MyClass{
    private: 
        T functor; 
    public: 
        //ctor 
        ... 
        void memberFunction(double value); 
};
于 2015-07-15T08:10:24.317 に答える