FiR*_*iTi 4 c++ templates c++11
我有三个功能几乎完全相同,但根据参数类型,过程有点不同:
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, "");
//...
}
Run Code Online (Sandbox Code Playgroud)
但我不希望用户必须决定调用哪个函数,所以我尝试自动执行.不幸的是到目前为止(我是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 ;
}
}
Run Code Online (Sandbox Code Playgroud)
我发现这个解决方案完全丑陋,我想知道是否有更好/更快/更优雅的东西?
如果使用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);
}
Run Code Online (Sandbox Code Playgroud)
示例: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);
}
...
Run Code Online (Sandbox Code Playgroud)
或者你可以使用模板专业化,但在这种情况下,它并不真正相关(我把它放在这里,因为它是原始答案):
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);
}
....
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |