7

引数を逆参照して結果を返す単項ファンクターを探しています。もちろん、何かを書くことはできますが、何かがすでに存在しているように見えました。

したがって、コードが与えられます:

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

ラムダの代わりに使用できるファンクターがあることを望んでいました。そのようなものは存在しますか、それともラムダを使用する必要がありますか?

4

1 に答える 1

9

「ファンクター」とは「関数オブジェクト」または「呼び出し可能オブジェクト」を意味すると仮定すると、標準ライブラリにはあなたが望むものはないようです

自分で実装するのは簡単です:

struct deferencer
{
    template <typename T>
    decltype(auto) operator()(T&& x) const
        noexcept(noexcept(*x))
    { 
        return *x; 
    }
};

-> auto暗黙の戻り値の型がであり、コピーを作成するため、ラムダは期待どおりに動作しないことに注意してください。考えられる正しいラムダの 1 つは次のとおりです。

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

ラムダの末尾の戻り値の型を明示的に指定しない場合、暗黙的なものは常にautowhich is a copy になります。ラムダはコピーを返すため、参照を返すかどうかは問題ではありません(つまり、によって返される参照は、ラムダのステートメントによってコピーされます)operator*operator*return

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

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

ワンドボックスの例

于 2017-01-05T14:21:32.390 に答える