2016-07-02 5 views
1

は、簡単なファンクタ私は、たとえば次のように使用することができます用語周囲のファンクタ

class LessThan { 
public: 
    explicit LessThan (int in) : val(in) {} 
    bool operator() (int param) const { 
     return param < val; 
    } 
private: 
    int val; 
}; 

を見てみましょう -

vector<int> myVector = factory(); 
size_t count = count_if(begin(myVector), end(myVector), LessThan(10)); 

ファンクタを取り巻く用語の私の理解では、クラスLessThanがファンクタであるということです。すなわちそれはオブジェクトではなくタイプである。すなわち抽象的であり、具体的ではない。

だから、LessThan(10)とは何ですか?ここでは、LessThanファンクタ型をインスタンス化してオブジェクトを作成しています。だから、それをファンクタオブジェクトと呼んでいますか?しかし、ファンクタは関数オブジェクトです。したがって、LessThan(10)は関数オブジェクトオブジェクトですか?

それは不合理ではありませんか?

+0

オブジェクトは、* *タイプです。あるいは、むしろ、それらは型の*インスタンス*です。ユーザー定義のクラスは型であり、インスタンス化するとその型のオブジェクトが取得されます。 –

+2

@JesperJuhl 'int a'の場合、... intは型で、' a'はオブジェクトです。したがって、2つは異なる。 –

+1

助けがあれば、このように考えてください: 'LessThan'は_functionオブジェクトの型です。 'LessThan(10)'は_関数オブジェクトです。 –

答えて

1

関数オブジェクトの用語は、正規オブジェクトの用語と同じです。ファンクタLessThan(10)のタイプはclass LessThanです。

ファンクションは、関数(つまり「より小さい」)とその引数の1つ(つまり、int val)の組み合わせです。同様の効果がファンクタ組成によって達成することができます。

auto f = bind(less<int>(), _1, 10); // f is LessThan(10) 

Demo.

+0

恐ろしい........ –

+1

@typetraitorそれは正しいです。ファンクタ型の多くは純粋な関数を表しているため、状態はありません(例えば、 'std :: less'、' std :: plus'など)。これは型とオブジェクトを混乱させるようになります。タイプは基本的に同じです。 – dasblinkenlight

関連する問題