c++ - 使用 SFINAE 但不要产生编译错误

标签 c++ c++11 sfinae

我的程序生成具有“类型”和标识符的随机字符串。像这样:

float       lHTY8Au8b9 = float();
int         dO3PNUInH6 = int();
float       B_MtShimak = float();
float       hgi_TzaVEv = float();
double      mfW8kr6h6q = double();
std::string lSLj9antfj = std::string();
char        MQkeARWYTL = char();
char        Oe7G_ZRJy6 = char();
float       qUwmOWeilK = float();
double      FJYIODwQfx = double();

然后我有以下内容来查看是否可以添加两个任意变量:

template <typename A, typename B>
typename std::enable_if<std::is_convertible<A, B>::value, decltype(A() + B())>::type
    try_to_add(A a, B b) {
        return a + b;
    }

当然,它可以工作,因为我收到以下错误:

main.cpp:51:54: error: no matching function for call to ‘try_to_add(double&, std::string&)’

  try_to_add<double,std::string>(mfW8kr6h6q,lSLj9antfj);

然而,我想要的是一个不会导致编译错误的候选列表。我无法对模板参数进行硬编码,因为它只接受整数,而且我无法检查生成器程序内部,因为它们只是字符串,并且尝试将 try_to_add 与不可转换类型一起使用将导致编译错误。我知道 SFINAE 是错误的方法,但有没有办法让 try_to_add 什么也不做,而不是生成编译错误?

Coliru

最佳答案

使用不执行任何操作的逆条件添加另一个覆盖。

template <typename A, typename B>
typename std::enable_if<!std::is_convertible<A, B>::value>::type
try_to_add(A, B) { }

关于c++ - 使用 SFINAE 但不要产生编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20201197/

相关文章:

c++ 03:由于enable_if,互斥方法

C++11 函数模板特化为类方法(如果存在)

c++ - 区分模糊成员请求错误和成员在 SFINAE 上下文中不存在错误?

带有列表初始化的 C++11 嵌套映射

c++ - 错误: declared here unique_ptr(const unique_ptr&) = delete;

c++ - 自定义类型的自定义 C++ 流

c++ - 在具有一个元素的列表上强制 std::vector 重载而不是 int 重载

c++ - 调试 C++ 与调试 C 相比

c++ - Qt/Qt Creator - 程序意外结束。 <程序路径> 崩溃

c++ - 如何格式化 std::chrono 持续时间?