根据编译时参数使方法可用

und*_*ndu 6 c++ c++11

有没有办法编译方法,取决于模板参数?我正在尝试创建一个可以处理2,3或更多维度的Coordinate类.我想提供access方法as x(),y()z(),但我希望z()方法只有在尺寸大于3时才可访问.现在(如下所示),我使用a static_assert来防止使用z()尺寸2的坐标.

template<typename DataType, int Dimension>
class Coord
{
private:
    std::array<DataType, Dimension> _data;

public:

    // how to achieve some kind of compile_if()
    DataType& z()
    {
        static_assert(Dimension >= 3, "Trying to access an undefined dimension.");
        return _data[2];
    }
};
Run Code Online (Sandbox Code Playgroud)

我想要做的是隐藏z()维度2的存在,以便这样做

Coord<int, 2> ci2(0,0);
ci2.z() = 3;   // shouldn't compile
Run Code Online (Sandbox Code Playgroud)

不使用static_assert就不编译.我见过很多关于std :: enable_if的问题,但据我所知,它是用来启用或禁用特定的重载.

问题是:是否有办法根据编译时参数使方法可用或不可用?

awe*_*oon 8

例如,您可以将您的函数声明为模板并std::enable_if像这样使用

template<typename DataType, int Dimension>
class Coord
{
private:
    std::array<DataType, Dimension> _data;

public:
    template <class T = DataType>
    typename std::enable_if<Dimension >= 3, T&>::type
    z()
    {
        return _data[2];
    }
};
Run Code Online (Sandbox Code Playgroud)


Pub*_*bby 6

您可以使用专门化:

template<typename DataType, int Dimension, bool HaveZ = (Dimension >= 3)>
class Coord;

template<typename DataType, int Dimension>
class Coord<DataType, Dimension, false>
{
private:
    std::array<DataType, Dimension> _data;

public:
};

template<typename DataType, int Dimension>
class Coord<DataType, Dimension, true>
{
private:
    std::array<DataType, Dimension> _data;

public:

    DataType& z()
    {
        return _data[2];
    }
};
Run Code Online (Sandbox Code Playgroud)

您可以将共享成员提升到单独的结构中以防止代码重复.