可変個引数テンプレートを使用しadd
て、任意の数の入力パラメーターを受け取り、Expression
(遅延評価される) 1 つのパラメーターを返すfunction を作成できます。特定の index に対して呼び出されると、この式はすべての入力ベクトルのすべてのi
要素を一度に合計します。i
#include <tuple>
#include <array>
template<class ... Ts>
struct Expression
{
Expression(const Ts& ... args)
: args(args ...) { }
auto operator[](const size_t& i) const
{
return std::apply([i](const auto& ... v) { return (v[i] + ...); }, args);
}
const std::tuple<const Ts& ...> args;
};
template<class ... Ts>
Expression<Ts ...> add(const Ts& ... args)
{
return Expression(args ...);
}
int main()
{
std::array v1{ 2,5,4 }, v2{ 9,4,2 }, v3{ 4,2,8 };
auto result = add(v1, v2, v3);
return result[2]; // returns 14
}
これはすべて非常に素晴らしくきちんとしているように見えますが、実際の operatorをオーバーロードすることは可能ですか。つまり、次のように記述します。
template<class ... Ts>
Expression<Ts ...> operator+(const Ts& ... args)
{
return Expression(args ...);
}
int main()
{
std::array v1{ 2,5,4 }, v2{ 9,4,2 }, v3{ 4,2,8 };
auto result = v1 + v2 + v3; // Compiler Error
return result[2];
}
残念ながら、 を使用した 2 番目のコードv1 + v2 + v3
ではコンパイル エラーが発生します。
- VS 2019:
Fatal Error C1001, An internal error has occurred in the compiler.
- GCC 8.3.0:
'Expression<Ts ...> operator+(const Ts& ...)' must have an argument of class or enumerated type
これを機能させる方法はありますか?