gpt4 book ai didi

c++ - 模板参数推导和默认模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:31 26 4
gpt4 key购买 nike

下面的代码使用 clang 和 gcc 编译并按我希望的方式工作,但在 Visual Studio 2015 RTM 中出现错误。我认为 clang 和 gcc 允许这样做是正确的,但我不确定。这段代码应该编译吗?

#include <iostream>
#include <type_traits>
#include <utility>

template <typename T, size_t N, typename IS = decltype(std::make_index_sequence<N>{})>
struct Vector {
T e_[N];
};

template <typename T, typename U, size_t N, size_t... Is>
constexpr auto operator+(const Vector<T, N, std::index_sequence<Is...>>& x,
const Vector<U, N>& y) {
using V = std::common_type_t<T, U>;
return Vector<V, N>{x.e_[Is] + y.e_[Is]...};
}

int main() {
const auto v0 = Vector<float, 4>{1, 2, 3, 4};
const auto v1 = Vector<float, 4>{5, 6, 7, 8};
const auto v2 = v0 + v1;
for (auto x : v2.e_) std::cout << x << ", ";
std::cout << std::endl;
}

如果我将 operator+ 更改为:Visual Studio 可以编译它:

template <typename T, typename U, size_t N, size_t... Is>
constexpr auto operator+(const Vector<T, N, std::index_sequence<Is...>>& x,
const Vector<U, N, std::index_sequence<Is...>>& y);

但我认为没有必要把 std::index_sequence<Is...>再次为 y .

最佳答案

IS 根本不应该是 Vector 类型的一部分。相反,使用辅助函数:

template <typename T, std::size_t N>
struct Vector {
T e_[N];
};

template <typename T, typename U, std::size_t N, std::size_t... Is>
inline constexpr auto add_impl(const Vector<T, N>& x, const Vector<U, N>& y,
std::index_sequence<Is...>) {
using V = std::common_type_t<T, U>;
return Vector<V, N>{x.e_[Is] + y.e_[Is]...};
}

template <typename T, typename U, std::size_t N,
typename Is = std::make_index_sequence<N>>
constexpr auto operator+(const Vector<T, N>& x, const Vector<U, N>& y) {
return add_impl(x, y, Is());
}

我无法访问 VS2015 来测试它,但它应该可以工作。

关于c++ - 模板参数推导和默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com