gpt4 book ai didi

c++ - 是否可以编写一个同时接受右值和左值的模板函数

转载 作者:太空宇宙 更新时间:2023-11-04 15:00:33 24 4
gpt4 key购买 nike

我想为 std::vector 添加算术重载(可能不是一个好主意,但我想以此为例)。我可以如下实现它

template <typename T, typename T2> auto& operator+=(std::vector<T>& a, const std::vector<T2>& b)
{
assert(a.size() == b.size());

std::transform(a.begin(), a.end(), b.begin(), a.begin(), std::plus<>());
return a;
}

template <typename T, typename T2> auto operator+(const std::vector<T>& a,
const std::vector<T2>& b)
{
auto a0 = a;
return a0 += b;
}

template <typename T, typename T2> auto operator+(std::vector<T>&& a,
const std::vector<T2>& b)
{
auto a0 = a;
return a0 += b;
}

为了利用 C++11 中的右值语义,我需要为 operator+ 编写两个函数。是否可以删除 operator+ 的重复代码?

最佳答案

您可以使用perfect-forwarding 并可能通过 SFINAE 进行约束,例如

template<typename T>
struct is_vector_addable: std::false_type {};

template<typename T>
struct is_vector_addable<std::vector<T>>: std::true_type {};

template <typename T, typename T2,typename E=
std::enable_if_t< is_vector_addable<std::decay_t<T>>::value >>
auto operator+( T&& a, const std::vector<T2>& b)
{
auto a0 = std::forward<T>(a);
return a0 += b;
}

Sebastian Redl 所建议,您还可以进一步限制 std::vector 具有可添加元素(在 std::transform 与 std::plus 语义的意义上,这可能会也可能不会成为你真正想要的),在 C++17 中:

template<typename T,typename T2,typename = void>
struct is_vector_addable: std::false_type {};

template<typename T,typename T2>
struct is_vector_addable<std::vector<T>,T2,std::void_t<
decltype( std::declval<T>() = std::declval<T>() + std::declval<T2>() )
>>: std::true_type {};

template <typename T, typename T2,typename E=std::enable_if_t< is_vector_addable<std::decay_t<T>,T2>::value >>
auto operator+( T&& a, const std::vector<T2>& b)

关于c++ - 是否可以编写一个同时接受右值和左值的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47408781/

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