gpt4 book ai didi

c++ - 如何使用 SFINAE 来防止模板函数变窄?

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

我正在尝试为 Vector 类实现基本算术运算,并希望支持混合基础类型,同时防止出现缩小。

template <typename T1,typename T2>
Vector<T1> operator+( Vector<T1> lhs, const Vector<T2>& rhs, std::enable_if< ! is_narrowing_conversion<T2,T1>::value >::type* = nullptr )
{ return lhs += rhs; }

我想实现 is_narrowing_conversion 以便它仅在类型不缩小时才允许转换。以下是一些示例:

Vector<double> a = Vector<double>() + Vector<float>(); //OK
Vector<float> a = Vector<float> + Vector<double>; //Fails to find the operator+ function

最后,我想编写第二个模板 operator+ 函数,它将通过返回 Vector 来处理相反的情况。

我找到了这篇文章 with an incomplete example .但这还不够,因为他指出它不允许 uint8_t 到 uint64_t 的转换。

我还发现了Daniel Krügler's paper on fixing is_constructible .特别是在这篇论文中,他提到使用列表初始化,它已经具有缩小的语义,但我不确定如何将他提到的内容转换成我可以用于 SFINAE 模板推导的适当特征。

最佳答案

如何通过 std::common_type 使用 SFINAE?

以下是一个简化的示例(没有 Vector,而是简单的值;没有 operator+(),而是 sum() 函数)但是我希望你能明白我的意思

#include <iostream>
#include <type_traits>


template <typename T1, typename T2>
T1 sum (T1 t1,
T2 const & t2,
typename std::enable_if<std::is_same<
T1,
typename std::common_type<T1, T2>::type
>::value>::type * = nullptr)
{ return t1 += t2; }

int main()
{
float a = 1.1f;
double b = 2.2;
long double c = 3.3;

std::cout << sum(b, a) << std::endl;
std::cout << sum(c, a) << std::endl;
std::cout << sum(c, b) << std::endl;
// std::cout << sum(a, b) << std::endl; compilation error
// std::cout << sum(a, c) << std::endl; compilation error
// std::cout << sum(b, c) << std::endl; compilation error
}

关于c++ - 如何使用 SFINAE 来防止模板函数变窄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44422223/

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