【问题标题】:How to take a typename as a parameter in a function? (C++)如何将类型名作为函数中的参数? (C++)
【发布时间】:2009-06-01 23:15:43
【问题描述】:

我需要能够将类型名作为参数传递:

int X = FileRead(file, 9, char);

这个概念是让 FileRead(std::fstream, int pos, ???) 读取 pos*sizeof(无论是什么类型) 以获得所需的位置。我试过模板:

template<typename T>
T FileRead(std::fstream file, int pos, T type)
{
    T data;
    file.read(reinterpret_cast<char*>(&data), sizeof(data));
    return data;
}

但这要求我每次想使用 FileRead 时都创建一个要使用的类型的变量,而且我真的不想仅仅因为一个函数而重新设计整个程序,所以无论如何都要使用类型名作为参数?

【问题讨论】:

    标签: c++ file-io typename function-parameter


    【解决方案1】:

    要将类型的名称用作参数,请使用模板。

    template<typename T>
    T FileRead(std::fstream &file, int pos)
    {
        T data;
        file.read(reinterpret_cast<char*>(&data), sizeof(T));
        return data;
    }
    

    这假定该类型是默认可构造的。如果不是,我想您无论如何都很难将其从文件中流式传输出来。

    这样称呼它:

    char value=FileRead<char>(file, pos);
    

    如果您不想在调用中指定类型,您可以修改您的 API:

    template<typename T>
    void FileRead(std::fstream &file, int pos, T &data)
    {
        file.read(reinterpret_cast<char*>(&data), sizeof(T));
    }
    

    然后像这样调用它 - 推断类型:

    char value;
    FileRead(file, pos, value);
    

    【讨论】:

    • 我认为您需要 T 作为参数,而不仅仅是作为返回值。
    • 像 FileRead 一样调用它(file, pos);
    • 您必须使用模板参数调用它。 codersource.net/cpp_function_template_overloading.html
    • 为了便于阅读,您可能需要添加 'void' 作为 FileRead() 的返回类型。
    • 我认为在这种情况下,not 默认构造的类型无论如何都无法传递(至少在 c++03 中),因为对于那些,它们是无论如何都不是 POD,对它们使用 read 将是 UB(并且“const T”也不能修改)。如果您的编译器可以将其作为扩展来执行,并且您想使用非默认可构造类型,则可以改用以下定义: template T FileRead(std::fstream &file, int pos, T data = T( )) { file.read(reinterpret_cast(&data), sizeof(T));返回数据; },这也是 C::resize 标准容器函数使用的相同技术。
    【解决方案2】:

    很简单:

    template<typename T>
    T FileRead(std::fstream file, int pos)
    {
        T data;
        file.read(reinterpret_cast<char*>(&data), sizeof(data));
        return data;
    }
    

    并通过以下方式调用它:

    char x = FileRead<char>(file, pos);
    

    【讨论】:

      【解决方案3】:

      我知道这篇文章得到了回答,但我仍然有一个问题,我从这个页面的答案中找到了一个简单的方法。您可以将类型名称传递给任何函数,如下所示:

      template<typename T>
      void function_name()
      {
          //you can access your type here with T
          //you can create an object from T or anything you want
          //for example :
      
          T obj;
      
          //or:
      
          T obj=new T;
      
      }
      
      int main(){
          function_name<YourTypeName>();
      }
      

      【讨论】:

        【解决方案4】:

        一旦你的程序被编译,就没有类型之类的东西了。这是C++的风格。

        【讨论】:

        • 如果那是真的,RTTI 就不存在了。
        猜你喜欢
        • 2012-07-07
        • 1970-01-01
        • 2015-07-29
        • 2018-10-30
        • 1970-01-01
        • 1970-01-01
        • 2020-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多