显式函数专用化的默认模板参数
Default template parameter for explicit function specializations
我想要一组可以接受任何uintX_t
变体的函数,而不必复制/粘贴大量代码。到目前为止,我正在尝试使用"标记"来确定要调用的写函数。由于显而易见的原因,T = unsigned
不起作用,因为我可能有uint32_t
、uint16_t
等
struct number_tag {};
struct hexadecimal : number_tag {};
struct number : number_tag {};
template <typename T = unsigned, typename Tag>
void write(T t);
然后稍后在.cpp文件中:
template <>
void write<unsigned, hexadecimal>(unsigned num)
{
}
template <>
void write<unsigned, number>(unsigned num)
{
}
理想情况下,我想这样称呼它:
write<number>(10);
write("n");
write<hexadecimal>(0xFF);
我该如何写这篇文章,这样我就不必做write<unsigned, number>
,也不必为每个uintX_t
变体创建一堆专业化?
不能部分专门化函数(boo),但可以使用更多无用的结构!
struct number_tag {};
struct hexadecimal : number_tag {};
struct number : number_tag {};
template <typename Tag, typename T = unsigned>
struct Writer;
template <typename T>
struct Writer<hexadecimal, T>
{
static void write(T num) {}
};
template <typename T>
struct Writer<number, T>
{
static void write(T num) {}
};
template <typename Tag, typename T = unsigned>
void write(T t)
{
Writer<Tag, T>::write(t);
}
int main()
{
write<number>(10);
write<hexadecimal>(0xFF);
}
如果您想根据tag
使用单独的write
专用化,则添加重载(因为函数不能部分专用化):
template <typename T = unsigned>
void write(T t, hexadecimal tag)
{
}
template <typename T = unsigned>
void write(T t, number tag)
{
}
template <typename Tag, typename U = unsigned>
void write(U num)
{
write<U>(num, Tag{});
}
write<number>(10);
write<hexadecimal>(0xFF);
write<number, std::uint16_t>(0xFF);
演示
如果您想为函数添加一个约束,使其只接受无符号整数类型,下面的代码会进行正确的验证:
template <typename Tag, typename U = unsigned>
auto write(U num) -> typename std::enable_if<std::is_unsigned<U>::value, void>::type
{
write<U>(num, Tag{});
}
write<number>(10u);
//write<number>(-1); // triggers error
演示2
注意:当前声明template <typename T = unsigned> void write(T t);
不会强制类型为unsigned
,因为编译器会根据实际参数的类型推导出参数的类型。
如果要强制传递给write
函数的任何类型为unsigned
,可以使用以下代码:
template <typename Tag, typename U>
void write(U num)
{
write<typename std::make_unsigned<U>::type>(num, Tag{});
}
write<number>(-1); // gets converted to unsigned type
演示3
相关文章:
- 如何使用默认参数等选择模板专业化
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 何时提供默认参数作为模板参数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 函数不接受 X 参数,函数使用默认参数
- initializer_list具有默认参数的构造函数
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 为什么C++构造函数在继承中需要默认参数?
- 必须非常量别名参数及其默认参数常量
- C++ 默认参数使用其他参数
- 组合函数参数包和默认参数
- 如何定义 Vector2f 的默认参数?[SFML]
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 如何设置默认参数以防用户不输入另一个参数
- 结构 c++ 中的默认参数
- 构造函数委托与默认参数
- 默认参数和函数指针作为函数参数C++
- 如何在继承层次结构中调用具有默认参数的构造函数?