2017-01-05 14 views
6

私はそれを逆参照して結果を返す単項ファンクタを探しています。もちろん、私は1つ書くことができます、それはちょうど何かが既に存在するはずのように見えました。間接係がありますか?

Soはコードを与えられた:私は、私が代わりにラムダを使用することができます数子があったことを期待していた

const auto vals = { 0, 1, 2, 3 }; 
vector<const int*> test(size(vals), nullptr); 

iota(begin(test), end(test), data(vals)); 

transform(cbegin(test), cend(test), ostream_iterator<int>(cout, " "), [](const auto& i){ return *i; }); 

Live Example

。そのようなものが存在するのか、それともラムダを使うだけでいいですか?"ファンクタ" であなたは"関数オブジェクト""呼び出し可能オブジェクト"there doesn't seem to be what you desire in the Standard Libraryを意味すると仮定すると

+2

私は[こちら](http://forums.codeguru.com/showthread.php?495892-std-機能はstd' 'に追加されなかった理由については非常に可能性の答えを見つけました逆参照および標準参照&p = 1933466#post1933466) –

+0

@WF面白いです、私は実際に質問をする前にその投稿を読んでいます。私が与えてくれた例がMCVE、[このための私の実際のユースケース](http://stackoverflow.com/a/41486541/2642059)* *である 'ベクトル :: const_iteratorの>' :( –

答えて

9

それを自分で実装することは簡単です:あなたのラムダは、その暗黙の戻り値の型として、何を期待しません


注コピーを作成し-> auto、です。一つの可能​​な正しいラムダは、次のとおりです。

[](const auto& i) -> decltype(auto) { return *i; } 

あなたは、ラムダの明示的な末尾の戻り値の型を指定しない場合は、暗黙の1が常にコピーあるautoになります。ラムダは、(すなわちoperator*によって返された参照は、その後、ラムダのreturn文によってコピーされる)コピーを返しますので、operator*は、参照を返すかどうかは関係ありません。

struct A 
{ 
    A() = default; 
    A(const A&) { puts("copy ctor\n"); } 
}; 

int main() 
{ 
    []{ return *(new A); }(); // prints "copy ctor" 
} 

wandbox example

+3

私が希望ですそれはまた、プロキシが –

+0

@JonathanWakelyオブジェクトを返すInputIteratorsのために働くように、 '' decltype(自動)を使用します。それは、より一般的にするために、コードを更新し、良い点を –

+0

私はここで行方不明です何@JonathanWakley私は[ビルトイン間接思いました? 。演算子](http://en.cppreference.com/w/cpp/language/operator_member_access#Built-in_indirection_operator)はなぜ、これが値で返すことになる値への参照を返し –

関連する問題