私はこれに尋ねた。question約std::variant
。バリアントが保持する型がすべてstd::cout
で印刷可能であることを考慮すると、訪問者を実装する簡単な方法はありますか?テンプレートはstd :: variantの訪問に使用できますか?
Hereたとえば、各タイプをカバーする複数のラムダがありますが、すべて同じことをします(std::string
を除く):std::cout << arg << ' ';
。私の自己を繰り返さない方法はありますか?
std::visit(overloaded {
[](int arg) { std::cout << arg; },
[](long arg) { std::cout << arg; },
[](double arg) { std::cout << arg; }
// I removed the std::string case
}, v); // v is the std::variant
、代わりに書き込み:
std::visit( [](auto arg) { std::cout << arg; }, v);
か何かのように:
template<typename T>
void printer(T arg) {std::cout << arg; }
//.......
std::visit(printer, v);
2番目のブロック(一般的なラムダを使用)は動作するはずです。テンプレートが単一の関数またはオブジェクトではないため、3番目のブロック(テンプレート関数付き)は機能しません。あなたは 'operator()'というテンプレートで独自の呼び出し可能コードを書くことができます: 'struct printer {template void operator {){T arg} {std :: cout << arg; }}; std :: visit(printer {}、v); '(これは、一般的なラムダとほぼ同じです)。 –
質問に[tag:C++]タグを追加し続けると、理由があります。今から自分でやってください。 –