C++ 根据条件选择结构

C++ 根据条件选择结构,c++,templates,conditional,C++,Templates,Conditional,我正在尝试读取带有头和点记录的las文件。标题包含从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

我正在尝试读取带有头和点记录的las文件。标题包含从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);
};
}

如果要根据某些数据选择
T
模板参数在编译时推导,不能在运行时选择。您需要使用继承或

如果你想让不同类型的向量具有预定义的位置
使用struct。

将二进制数据从磁盘直接读入struct会带来麻烦。结构的二进制布局可能因编译器而异。为什么您的函数要从头开始查找文件?如果有人只想从文件的某个部分开始加载,该怎么办?这就是你要问的,一个向量如何能容纳每个元素都需要不同类型的元素?不,我的问题是,我希望根据条件将结构确定为模板。应该类似于的第二个答案,但在4个typenames而不是2个typenames上,我在代码中看不到任何条件。你可以为你的目标添加一些“伪代码”(不需要编译)吗?为类似的答案添加了一个链接
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));
}
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;