相关疑难解决方法(0)

SFINAE工作在返回类型但不作为模板参数

我已经使用了SFINAE习惯用了很多次,我习惯于把std::enable_if<>模板参数放在模板参数而不是返回类型中.但是,我遇到了一些不起作用的琐碎案例,我不知道为什么.首先,这是我的主要内容:

int main()
{
    foo(5);
    foo(3.4);
}
Run Code Online (Sandbox Code Playgroud)

这是一个foo触发错误的实现:

template<typename T,
         typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T)
    -> void
{
    std::cout << "I'm an integer!\n";
}

template<typename T,
         typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T)
    -> void
{
    std::cout << "I'm a floating point number!\n";
}
Run Code Online (Sandbox Code Playgroud)

这是一个可以正常工作的等效代码:

template<typename T>
auto foo(T)
    -> typename std::enable_if<std::is_integral<T>::value>::type
{
    std::cout << "I'm an integrer!\n";
}

template<typename T>
auto foo(T)
    -> typename std::enable_if<std::is_floating_point<T>::value>::type
{
    std::cout << "I'm a floating point number!\n";
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么第一次执行 …

c++ templates sfinae c++11

33
推荐指数
3
解决办法
5073
查看次数

使用enable_if进行C++模板重载:使用g ++和clang进行不同的行为

在解析基类的模板化成员函数的重载期间,我观察到g ++(5.2.1-23)和clang(3.8.0)之间的不同行为-std=c++14.

#include <iostream>
#include <type_traits>

struct Base
{
  template <typename T>
  auto a(T t) -> void {
    std::cout<< "False\n";
  }
};

template <bool Bool>
struct Derived : public Base
{

  using Base::a;
  template <typename T, bool B = Bool>
  auto a(T t) -> std::enable_if_t<B, void>
  {
    std::cout<< "True\n";
  }
};

int main()
{
  Derived<true> d;
  d.a(1); // fails with g++, prints "true" with clang
  Derived<false> d2;
  d2.a(1); // fails with clang++, prints "false" with g++
}
Run Code Online (Sandbox Code Playgroud)

Derived<true>::a …

c++ templates overloading c++14

14
推荐指数
1
解决办法
439
查看次数

标签 统计

c++ ×2

templates ×2

c++11 ×1

c++14 ×1

overloading ×1

sfinae ×1