...私はここに私のブログへのリンクを提供することがOKになるかどうかわからないです。打ち鳴らす++苦情が
error: variable 'out_' declared with deduced type 'auto' cannot appear in its own initializer
return out_ ;
^
と私はあなたのコードを拒否右打ち鳴らす++(と間違ったG ++、それを受け入れる)ですが、私はわからないと思います。
とにかく、ラムダ自体が興味深いという考えがあります。
オブジェクトに参照を返すテンプレートoperator()
を持つ構造体に基づいて、非ラムダ(ただし、標準に準拠し、移植性があることを望みます)ソリューションを提案します。
私は、あなたは一例で、std::endl
と
outS{}("Hello ")("from ")("GCC ")(__VERSION__)(" !");
問題は異なるもので、書くことができ
struct outS
{
template <typename T>
outS const & operator() (T const & t) const
{
std::cout << t;
return *this;
}
};
を意味します。
問題が定義されているstd::endl
template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& endl(std::basic_ostream<CharT, Traits>& os);
として(CPP Reference参照)ことで、std::endl
はテンプレート関数です。オペレータはstd::endl
の特定のバージョンを選択し<<
ので
あなたは
std::cout << std::endl;
または
std::wcout << std::endl;
を書くことができます。
outS{}(std::endl);
を次のようにoutS
がstd::endl
の特定のバージョンを選択することはできませんので、しかし、あなたはoutS
にそれを渡すことはできません。
したがって、明示的に指定する必要があります。 std::endl
をstd::cout
と一致させるには、std::endl
のテンプレートパラメータはchar
とstd::char_traits<char>
です。
だから、あなたは(私が知っている、醜い)書くことができます
outS{}(std::endl<char, std::char_traits<char>>);
しかし、あなたがstruct
ベースのソリューション(outS
)を実装している場合、あなたはとてもあなたが書くことができendl()
方法
outS const & endl() const
{
std::cout << std::endl;
return *this;
}
を追加することができます
outS{}.endl();
以下は、 Gの例で
#include <iostream>
struct outS
{
template <typename T>
outS const & operator() (T const & t) const
{
std::cout << t;
return *this;
}
outS const & endl() const
{
std::cout << std::endl;
return *this;
}
};
int main()
{
outS{}("Hello ")("from ")("GCC ")(__VERSION__)(" !").endl();
}
[型付きラムダ計算(https://en.wikipedia.org/wiki/Typed_lambda_calculus)自体を返す関数は、入力が困難(または不可能)です。したがって**関数はそれ自身を返すべきではありません**(それはC++に特有ではなく、Ocaml、Haskellなどでも失敗します)。数学的には、セットはそのパワーセットにはなりません([ZFC](https://en.wikipedia.org/wiki/Zermelo%E2%80%93Fraenkel_set_theory))。 IMHO、あなたのコードは理にかなっていません。 –
あなたは解決しようとしている問題は何ですか? – Barry