包含 std::vector 的 C++ 模板

标签 c++ class templates vector

最近我写了一个包含四个函数的类来打开和读取多列数据文件(最多 4 列)。在函数中,要打开的文件名“file_name”从主程序传递到类“Read_Columnar_File”中的函数。使用 std::vector 读取数据并传回主程序。但是,它要求程序员在每次使用时更改输入列的数据类型,这是错误的根源。文件名总是一个字符串,所以不需要模板化;但是,使用 vector 读取的数组的数据类型可能会发生变化,因此需要对其进行通用模板化。我正在尝试将该类转换为模板类,但缺少对制作包含 std::vector 的模板的过程的一些基本理解。为了简化开发过程,我回到了类中名为“Read_One_Column”的单个例程,并试图将其转换为数据类型标记为 Type1 的模板。我认为我的问题出在语法上,因为调试器告诉我主程序中的命令未定义。任何有助于纠正此问题的建议将不胜感激。现有代码的拷贝附在下面。

#include <vector>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <iterator>

template <class Type1> class Read_Columnar_File {
public:
    void Read_One_Column(const std::string& file_name,std::vector<Type1>& Column1);
};

template <class Type1> void Read_Columnar_File<Type1>::Read_One_Column(const std::string& file_name,
                                                                       std::vector<Type1>& Column1)
{
    std::ifstream inp(file_name,std::ios::in | std::ios::binary);
    std::istream_iterator<Type1> start((inp)), end;
    if(inp.is_open()) {
    Column1.assign(start,end);
}
    else std::cout << "Cannot Open " << file_name << std::endl;
    inp.close();
}

int main(int argc, const char * argv[]) {
    int i;
    std::vector<float> str1;
    Read_Columnar_File<float> ob1;

    char str[20];
    std::strcpy(str,"Test.txt");

    ob1.Read_One_Column(str,str1);

    for(i=0; i < 7; i++) std::cout << str1[i] << std::endl;

    return 0;
}

最佳答案

语法更简单:

template <typename Type1>
void Read_One_Column(const std::string& file_name,
                     std::vector<Type1>& Column1) {
    ...
}

根本不需要创建类(它只是一个模板函数)。

如果出于其他原因需要将函数放在类中,则语法相同

struct Read_Columnar_File {
    ...
    template<typename Type1>
    void Read_One_Column(const std::string& file_name,
                         std::vector<Type1>& Column1) {
        ...
    }
}

它将是类的模板方法。

关于包含 std::vector 的 C++ 模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832940/

相关文章:

c++ - 我如何声明一个放在 main 之后的类模板?

c++ - 如何将模板类对象作为 C++ 中非模板类的成员?

c++ - 通过单独的类将数组指针传输到 CUDA 内存中

C++ - 将右值引用传递给函数?

ES6 中的 Javascript 类,如何将它们导入到其他 js 文件和 html 文件中?

Deck 和 Card 对象上的 C++ 访问冲突读取位置 0xCCCCCCCC

c++ - 如何在 cmake 中使用 QML_ELEMENT

c++ - C 中预自增运算符的作用是什么?

ios - 以非编程方式使用 (UIView) 类 - Swift

Javascript 模板还是其他解决方案?