gpt4 book ai didi

c++ - 如何使用模板元编程在 C++17 中将一种类型转换为另一种类型?

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:38 25 4
gpt4 key购买 nike

我需要在 C++ 中实现类型转换器以将某种类型转换为另一种类型。例如,将 int16_t 转换为 float,将 int64_t 转换为 double。我已经使用模板特化实现了一个:

template<class T>
struct TypeConverter
{

};
template<>
struct TypeConverter<int16_t>
{
using type = float;
};

template<>
struct TypeConverter<int64_t>
{
using type = double;
};

TEST(Exp, TypeConveter) {

static_assert(std::is_same_v<TypeConverter<int16_t>::type, float>);
static_assert(std::is_same_v<TypeConverter<int64_t>::type, double>);
}

是否有更好(更紧凑)的方式使用 C++17 tmp 功能实现此目的?

最佳答案

另一种简单的方式(兼容C++11):

template<class T> struct Type {};

float type_convert(Type<int16_t>);
double type_convert(Type<int64_t>);

int main() {
static_assert(std::is_same_v<decltype(type_convert(Type<int16_t>{})), float>);
static_assert(std::is_same_v<decltype(type_convert(Type<int64_t>{})), double>);
}

这种方法的好处是它使用参数相关的名称查找 (ADL) 来查找相应的 type_convert 函数声明(没有定义 必要)。如果您需要处理用户定义的类型 (UDT),可以很容易地在声明它们的同一命名空间中为它们添加相应的 type_convert 重载(无需打开 traits 命名空间来定义另一个特化UDT 的特征类模板)。例如:

namespace N { 
struct MyType;
long double type_convert(Type<MyType>);
}

然后:

// type_convert is found by ADL.    
static_assert(std::is_same_v<decltype(type_convert(Type<N::MyType>{})), long double>);

关于c++ - 如何使用模板元编程在 C++17 中将一种类型转换为另一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54472751/

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