c++ - 显式函数特化的默认模板参数

标签 c++ templates specialization

我想要一组接受任何 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);
}

关于c++ - 显式函数特化的默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25823190/

相关文章:

c++ - 是否需要对具有格式错误的默认模板参数的未使用成员模板进行诊断?

templates - 如何在外部文件中定义 Handlebar.js 模板

c++ - 模板函数特化默认参数

c++ - 模板类不同的返回类型取决于类参数

c++ - 在 C++ 中使用类型名作为函数参数时如何传递引用?

c++ - UDP 多播不适用于 linux Debian

C++ - typedef/用于函数模板

c++ - 如何重置已保存变量以准备下次调用的模块的状态?

c++ - 仅从 PDF 文件中复制必要的对象

c++ - 如何专门针对模板类中的成员函数类型?