C++ 在if..else中修改typedef声明

C++ 在if..else中修改typedef声明,c++,types,binary,C++,Types,Binary,我试图解决的问题是: 读取二进制文件并将内容写入文本文件。二进制文件中内容的格式由用户使用选项指定,例如bin2text.exe[filename][/f],其中/f表示二进制文件中的内容为浮点型 我当前的算法: 宣布: typedef int datatype; 使用if…else或switch…case在主代码中将数据类型修改为float、unsigned int short等 问题是: 在if…else中成功修改了数据类型,但在if…else/switch…case之外切换回默认值(此处

我试图解决的问题是:

读取二进制文件并将内容写入文本文件。二进制文件中内容的格式由用户使用选项指定,例如
bin2text.exe[filename][/f]
,其中
/f
表示二进制文件中的内容为浮点型

我当前的算法:

宣布:

typedef int datatype;
使用
if…else
switch…case
在主代码中将数据类型修改为float、unsigned int short等

问题是:

if…else
中成功修改了数据类型,但在
if…else/switch…case
之外切换回默认值(此处为int)。这意味着,我可以将二进制读入向量,然后将向量写入
if…else
语句中的文本文件。但这样,代码变得太重复(每个if块都有一个向量声明、初始化、读入向量并写入文本文件)。最好避免这种重复


有人能给我指路吗?谢谢。

如果您发现自己编写的代码除了涉及的类型之外都是相同的,那么它通常是模板的一个很好的候选者

没有错误检查或输入验证的简单(未测试)变体:

template<typename T>
void convert(std::istream& in, std::ostream& out)
{
    T data;
    while (in.get(reinterpret_cast<char*>(&data), sizeof(data)))
    {
        out << data << std::endl;
    }
}

int main(int argc, char* argv[])
{
    std::ifstream input(argv[1], std::ios::binary);
    std::ostream& output = std::cout;
    std::string format = argv[2];
    if (format == "/f")
    {
        convert<float>(input, output);
    }
    else
    {
        convert<int>(input, output);
    }
}
模板
无效转换(标准::istream&in,标准::ostream&out)
{
T数据;
while(在.get(reinterpret_cast(&data)、sizeof(data))中)
{

Outlook C++不允许运行时修改声明。所有的声明在编译时都是最终的。你必须更多地考虑你的程序设计,以及如何处理不同的类型……这意味着,你可以使用<代码> >如果< < /代码> />代码> > /代码> />代码>需要区分编译时文件和运行时文件。
typedef
是编译时文件,如果else和switch case是运行时文件。@JoachimPileborg:example:This-works:typedef int-datatype;int-main(){TyPufFuffDeType;CUTH@ Potatoswatter表示自从C++ 11以来有条件存在。我现在没有使用它。在C++的老版本中是否有一个等价物?谢谢。早些时候当我看到代码中的“模板”这个词时,我只是跳过并搜索了一个没有这个词的解决方案。现在我看到了它是什么朋友!哦,只是为了分享这个F。维基百科上的IRTS:模板是C++编程语言的任何特性,允许函数和类使用泛型类型操作。这允许函数或类在许多不同的数据类型上工作,而不必为每个数据类型重写。