C++ 函数重载,enable_if 的替代品?

标签 c++ templates overloading c++03

如果我有一个函数,insert,在模板类中,并且我重载它以采用填充模式:

void insert(const size_type N, const value_type &element);

或范围模式:

template <class iterator_type>
void insert(const iterator_type begin, const iterator_type end)

当我将类的 value_type 指定为 int 时,会导致以下调用:

insert(500, 50);

不明确,因为它假定 500int,因此与 size_type N 不匹配,而不是调用 fill模式函数,调用模板化范围函数并失败。

这是一个与 C++03 兼容的库,它不能使用像 boost 这样的外部库,只能使用内置的 C++ 代码。我发现的唯一不需要 C++11 的 enable_if 的解决方法是创建额外的重载,用 int 替换 size_typelong intchar 等,并从中调用填充函数。显然这是有问题的,因为您可以有很多与 500 匹配的不同类型。有什么建议吗?

最佳答案

利用 SFINAE 的优势:

void insert(const size_type N, const value_type &element);

template <class iterator_type>
void insert(iterator_type begin, iterator_type end, char (*)[sizeof(*begin)] = NULL);

insert 范围版本中的额外虚拟参数将被编译器优化掉。它的唯一作用是消除模板函数对不能与取消引用运算符一起使用的类型的重载解析。

技巧说明:

char (*)[sizeof(*begin)] 代表指向大小等于 sizeof(*begin) 的字符数组的指针。如果变量 begin 不可取消引用,那么这将是一个错误。但是,在函数重载决策期间考虑函数模板的情况下,此类错误不会停止编译,而只是丢弃模板(替换失败不是错误 - SFINAE)。

关于C++ 函数重载,enable_if 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37803630/

相关文章:

c++ - 静态库和共享库的区别?

c++ - 当指针指向的对象被另一个类的实例删除时重新分配指针

locale - 如何在不收到警告且不使用类型类的情况下重载符号?

C++ 函数匹配和常量

c++ - 在不执行脚本的情况下调用 Lua 函数

android - 将私有(private)字段添加到 android 上的 JNI 类会卡住应用程序

excel - 如何将保存的图表模板应用到现有图表?

c++ - 使用 initialization_list 导致歧义的函数重载

c++ - 在 C++ 中重新创建函数签名并通过模板包进行调用

c++ - 显式模板实例化 : MSVC vs. GCC