0

使用可变参数模板,我们可以编写一个函数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

有没有办法使这项工作?

4

0 回答 0