gpt4 book ai didi

c++ - 派发良好模板功能的最佳方式

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

我有三个函数,做几乎相同的事情,但根据参数类型的不同,过程略有不同:

template<typename T> void Func1(const T *in, T *out)
{
static_assert(std::is_same<T, INT8>::value
|| std::is_same<T, UINT8>::value
|| std::is_same<T, INT16>::value
|| std::is_same<T, UINT16>::value, "");
//...
}

template<typename T> void Func2(const T *in, T *out)
{
static_assert(std::is_same<T, INT32>::value || std::is_same<T, UINT32>::value, "");
//...
}

template<typename T> void Func3(const T *in, T *out)
{
static_assert(std::is_same<T, float>::value || std::is_same<T, double>::value, "");
//...
}

但我不希望用户必须决定调用哪个函数,所以我尝试自动执行。不幸的是到目前为止(我是 C++ 初学者),我知道的唯一方法是:

template<typename T> void Function(const T *in, T *out)
{
if (std::is_same<T, UINT8>::value
|| std::is_same<T, UINT16>::value
|| std::is_same<T, INT8>::value
|| std::is_same<T, INT16>::value)
{
Func1(in, out);
return ;
}

if ( std::is_same<T,INT32>::value || std::is_same<T,UINT32>::value )
{
Func2(in, out);
return ;
}

if ( std::is_same<T,float>::value || std::is_same<T,float>:: double )
{
Func3(in, out);
return ;
}
}

我发现这个解决方案非常丑陋,我想知道是否有更好/更快/更优雅的解决方案?

最佳答案

如果您使用 C++11 或更高版本,您可以使用 type_traits (SFINAE):

template<typename T>
typename std::enable_if<std::is_same<T, INT8>::value
|| std::is_same<T, UINT8>::value
|| std::is_same<T, INT16>::value
|| std::is_same<T, UINT16>::value>::type Function(const T*in, T*out)
{
Func1(in, out);
}

template<typename T>
typename std::enable_if<std::is_same<T, INT32>::value
|| std::is_same<T, UINT32>::value >::type Function(const T*in, T*out)
{
Func2(in, out);
}

template<typename T>
typename std::enable_if<std::is_same<T, float>::value
|| std::is_same<T, double>::value >::type Function(const T*in, T*out)
{
Func3(in, out);
}

示例:http://coliru.stacked-crooked.com/a/b4f000fa6ffa8f19

或者如果你不能使用 C++11 或更高版本,你可以使用重载而不是模板:

void Function(const UINT8 *int, UINT8 * out)
{
Func1(in, out);
}
...
void Function(const UINT32 *int, UINT32 * out)
{
Func2(in, out);
}
...

或者您可以使用 template specialization但是,在这种情况下,它并不真正相关(我把它留在这里,因为它在原始答案中):

template<typename T> Function(const T *in, T *out);

template<> void Function(const UINT8 *in, UINT8 * out)
{
Func1(in, out);
}

template<> void Function(const INT8 *in, INT8 * out)
{
Func1(in, out);
}

....

关于c++ - 派发良好模板功能的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37203911/

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