根据条件选择结构
Choose structs based on condition
我正在尝试读取带有 header 和点记录的 las 文件。 header 包含可以从 0 到 3 变化的点格式信息,这会导致具有额外字段的不同格式。
LasReader.h
template <typename T>
class las_reader
{
public:
las_reader();
las_reader(std::ifstream &FileHandle);
~las_reader();
private:
las_header_reader lh; // struct to read las header info
std::vector<T> lp; // vector of struct template T to read las points
void lasReadHeader(std::ifstream &FileHandle);
void lasReadPoints(std::ifstream &FileHandle);
};
LasReader.cpp
template <typename T>
void las_reader<T>::lasReadPoints(std::ifstream &FileHandle)
{
// reserves the size of vector
lp.resize(lh.num_pointRecords);
FileHandle.seekg(lh.offset_pointData,std::ios::beg);
// iterator which goes through file and reads to vector
FileHandle.read(reinterpret_cast<char*>(&lp[0]),lh.num_pointRecords *sizeof(T));
}
现在我想根据条件把struct format作为模板。我尝试了 std::conditional
,如 C++ type traits to select between T1 and T2 的第二个答案中给出的那样,但它适用于两个模板之间的布尔值。
编辑
看起来像这样的东西:
template <typename T, typename U, typename V, typename W>
struct select_format
{
typedef typename std::conditional<std::is_base_of<T,las_points_reader>::value, T, U, V, W>::type base_type;
}
如果你想select T
基于一些数据
模板参数是在编译时推导出来的,不能在运行时select编辑。你需要使用继承或者Boost.Variant.
如果你想要具有预定义位置的不同类型的向量
使用结构。
我正在尝试读取带有 header 和点记录的 las 文件。 header 包含可以从 0 到 3 变化的点格式信息,这会导致具有额外字段的不同格式。
LasReader.h
template <typename T>
class las_reader
{
public:
las_reader();
las_reader(std::ifstream &FileHandle);
~las_reader();
private:
las_header_reader lh; // struct to read las header info
std::vector<T> lp; // vector of struct template T to read las points
void lasReadHeader(std::ifstream &FileHandle);
void lasReadPoints(std::ifstream &FileHandle);
};
LasReader.cpp
template <typename T>
void las_reader<T>::lasReadPoints(std::ifstream &FileHandle)
{
// reserves the size of vector
lp.resize(lh.num_pointRecords);
FileHandle.seekg(lh.offset_pointData,std::ios::beg);
// iterator which goes through file and reads to vector
FileHandle.read(reinterpret_cast<char*>(&lp[0]),lh.num_pointRecords *sizeof(T));
}
现在我想根据条件把struct format作为模板。我尝试了 std::conditional
,如 C++ type traits to select between T1 and T2 的第二个答案中给出的那样,但它适用于两个模板之间的布尔值。
编辑 看起来像这样的东西:
template <typename T, typename U, typename V, typename W>
struct select_format
{
typedef typename std::conditional<std::is_base_of<T,las_points_reader>::value, T, U, V, W>::type base_type;
}
如果你想select T
基于一些数据
模板参数是在编译时推导出来的,不能在运行时select编辑。你需要使用继承或者Boost.Variant.
如果你想要具有预定义位置的不同类型的向量
使用结构。