相关疑难解决方法(0)

std :: enable_if有条件地编译成员函数

我想尝试一个简单的例子来了解如何使用std::enable_if.在我读完这个答案之后,我认为想出一个简单的例子应该不会太难.我想用来std::enable_if在两个成员函数之间进行选择,并且只允许使用其中一个成员函数.

不幸的是,下面的代码不能用gcc 4.7进行编译,经过数小时和数小时的尝试后我会问你们我的错误是什么.

#include <utility>
#include <iostream>

template< class T >
class Y {

    public:
        template < typename = typename std::enable_if< true >::type >
        T foo() {
            return 10;
        }
        template < typename = typename std::enable_if< false >::type >
        T foo() {
            return 10;
        }

};


int main() {
    Y< double > y;

    std::cout << y.foo() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

gcc报告以下问题:

% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x    enable_if.cpp   -o enable_if
enable_if.cpp:12:65: error: `type' in …
Run Code Online (Sandbox Code Playgroud)

c++ templates g++ c++11

144
推荐指数
7
解决办法
10万
查看次数

C++为什么SFINAE只有一个类模板参数失败?

我正在使用这个答案的样式SFINAE,以便通过使用适当的成员函数调用泛型矢量对象.例如,以下代码operator[](int) const首先调用,如果不存在,则operator()(int) const:

template<int I> struct rank : rank<I-1> { static_assert(I > 0, ""); };
template<> struct rank<0> {};

template<typename VectorType>
struct VectorWrapper
{
    auto get(int i) const
    {
        return get(v, i, rank<5>());
    }

    template<typename V, typename = std::enable_if_t<has_bracket_operator<const V>::value> >
    auto get(V const& v, int i, rank<2>) const
    {
        return v[i];
    }

    template<typename V, typename = std::enable_if_t<has_parenthesis_operator<const V>::value> >
    auto get(V const& v, int i, rank<1>) const
    {
        return v(i);
    }

    VectorType v; …
Run Code Online (Sandbox Code Playgroud)

c++ templates sfinae c++11

7
推荐指数
1
解决办法
847
查看次数

boost :: enable_if_c似乎不起作用

可能重复:
如何使用enable_if根据类的模板参数启用成员函数

我有一个类模板:

template<typename T, size_t N> class Vector
Run Code Online (Sandbox Code Playgroud)

我想启用具体的构造函数N,所以我这样做:

Vector(typename boost::enable_if_c<N==2, T>::type const &e0, T const &e1) {
    data[0] = e0;
    data[1] = e1;
}
Run Code Online (Sandbox Code Playgroud)

但编译器(MSVC 2010 SP1)给出了一个错误,而不是应用SFINAE.错误是:

error C2039: 'type' : is not a member of 'boost::enable_if_c<B,T>'
      with
      [
          B=false,
          T=float
      ]
Run Code Online (Sandbox Code Playgroud)

问题是什么?这是一个已知的问题吗?我该如何解决?它是唯一可以使用的解决方案static_assert吗?

编辑: GCC也没有成功:http://ideone.com/7Ejo8

c++ boost sfinae

6
推荐指数
1
解决办法
1228
查看次数

标签 统计

c++ ×3

c++11 ×2

sfinae ×2

templates ×2

boost ×1

g++ ×1