有没有办法编译方法,取决于模板参数?我正在尝试创建一个可以处理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的问题,但据我所知,它是用来启用或禁用特定的重载.
问题是:是否有办法根据编译时参数使方法可用或不可用?
例如,您可以将您的函数声明为模板并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)
您可以使用专门化:
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)
您可以将共享成员提升到单独的结构中以防止代码重复.
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |