使用可变参数模板,我们可以编写一个函数add
,它接受任意数量的输入参数,然后返回一个Expression
(延迟计算)。当调用特定索引时,此表达式一次性对所有输入向量的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];
}
不幸的是,第二个代码 usingv1 + v2 + v3
导致编译错误:
- 与 2019 年相比:
Fatal Error C1001, An internal error has occurred in the compiler.
- 海湾合作委员会 8.3.0:
'Expression<Ts ...> operator+(const Ts& ...)' must have an argument of class or enumerated type
有没有办法使这项工作?