根据编译时参数使方法可用
Making a method available depending on a compile-time argument
是否有一种方法来编译一个方法,取决于模板参数?我试图创建一个坐标类,可以处理2,3或更多的维度。我想提供访问方法作为x()
, y()
和z()
,但我希望z()
方法是可访问的,只有当维度大于3。现在(如下所示),我使用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];
}
};
我想做的是隐藏维度2的z()
的存在,这样
Coord<int, 2> ci2(0,0);
ci2.z() = 3; // shouldn't compile
如果不使用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];
}
};
您可以使用专门化:
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];
}
};
您可以将共享成员提升到单独的结构中,以防止代码重复。
您可以使用这种基于专门化的方法:
#include <array>
template<typename DataType, int Dimension, bool = (Dimension < 3)>
class Coord
{
protected:
std::array<DataType, Dimension> _data;
};
template<typename DataType, int Dimension>
class Coord<DataType, Dimension, false> : public Coord<DataType, Dimension, true>
{
public:
DataType& z()
{
return this->_data[2];
}
};
int main()
{
Coord<double, 3> c3;
c3.z(); // OK
Coord<double, 2> c2;
c2.z(); // ERROR!
}
相关文章:
- c++方法参数只能在linux的发布模式下自行更改
- 使用移动语义:右值引用作为方法参数
- 无法将动态创建的对象数组从 qml 发送到 c++ 作为方法参数
- 将方法参数类型更改为子类中的派生类
- ofstream作为C 中的方法参数
- 使用 gmock 匹配器将 std::function 设置为 EXPECT_CALL 中的方法参数
- C com 方法参数扣除
- 获取非静态方法参数计数
- 使用 gmock 返回模拟方法参数
- 运行 QML 时出现"未知方法参数类型"错误
- 基本C - 构造contaning对象引用,并将其作为方法参数传递
- 将C 方法参数转换为模板参数会因编译错误而失败
- 如何在方法参数中使用boost :: asio :: buffer
- qsharedPointer作为方法参数或方法的返回值的良好实践
- 如何将方法指针声明为Typedef方法参数
- 方法参数中的 OpenCV 垫"预期")""
- 方法参数中的 consst* 常量
- 带有“class”详细类型说明符的方法参数
- 具有原始方法参数派生类的 C++ 重载方法参数
- C++ std::string length() 或 size() 不适用于方法参数