模板函数C ++,取param U并返回T.

时间:2016-03-06 15:44:08

标签: c++ qt templates

我遇到模板问题,我想获取文件的内容并将其存储在String中。我正在使用Qt处理一个泛型函数,该函数将处理char *,QString和string。

我有一个模板,我打电话给:

std::string test = openStyle("style.css");

我想进入 test styleToAdd ,这是我的文件 style.css 的内容:

编辑:将const T& openstyle更改为const T,感谢Stadium。

template<typename T>
const T openStyle(const T &type)
{
    QFile File(QCoreApplication::applicationDirPath() + "/" + type);
    File.open(QFile::ReadOnly);
    QString styleToAdd = QLatin1String(File.readAll());

    return (styleToAdd);
}

但汇编说:

invalid initialisation of reference type "const char (&)[14]" from expression "QString"

我认为这是因为在模板中,返回值与参数相同而不是我的 test 变量,但是有没有办法能够返回另一种类型(通用方式) )

所以我们可以用模板做这样的事情:

std::string test = openStyle("style.css");
char * test = openStyle("style.css");
QString test = openStyle("style.css");
const char * test = openStyle("style.css");

4 个答案:

答案 0 :(得分:2)

您可以使用C ++ 14进行编译,并使用-std=c++1y进行自动返回类型演绎:

template<typename T>
auto T openStyle(const T &type)
{
    QFile File(QCoreApplication::applicationDirPath() + "/" + type);
    File.open(QFile::ReadOnly);
    QString styleToAdd = QLatin1String(File.readAll());

    return (styleToAdd);
}

答案 1 :(得分:1)

您不需要模板。如果type是不是字符串的任何内容或者无法隐式转换为字符串,则代码将失败。

我看到你想从中得到的例子,我可以告诉你的是

  • QString包含toStdString()toUtf8()等函数,这些函数返回std::string对象的QString等效项
  • std::string可以使用c_str()函数转换为C字符串。

此外,您还可以使用QStringQByteArray转换为C字符串,以存储QString::toLatin1()的结果,然后调用QByteArray::data()并将其分配给const char *。这有点超过顶级omho,但它是另一种做事方式。

如果您不希望在每次要将QString转换为两个标准C / C ++字符串之一时执行所有步骤和调用,则可以创建为您执行此操作的小函数表示。

答案 2 :(得分:1)

无法以您尝试的方式自动确定函数的返回类型。

如果你想要一个你所描述的模板函数,语法将是这样的:

template<typename T, typename U>
const T &openStyle(const U &type)

但你需要这样称呼它:

std::string test = openStyle<std::string,const char[]>("style.css");

这可能不是你想要的。除此之外,你必须找到一种方法将QString styleToAdd转换为任何类型T - 所以问题没有解决,只是转移到了返回类型。

由于文件名始终是一个字符串,您只需在此处选择一个,并始终返回QString并定义您的函数:

const QString &openStyle(const std::string &type) 
//choose if you like std::string, QString or char[] here.

虽然您不能在QString之外重载强制转换运算符,但您可以为所需类型全局重载流运算符:

 operator<< (std::string& left,const QString& right){left = right.toStdString();}
 operator<< (char*, const QString&); //similar conversions here
 operator<< (QString&, const std::string&); //and here

使用提供的函数QString::toStdString()std::string::c_str(),然后写:

std::string test << openStyle("style.css");
char * test << openStyle("style.css");
QString test << openStyle("style.css");
const char * test << openStyle("style.css");

答案 3 :(得分:1)

考虑到你正在使用QT,你可能会考虑只使用QString类,并在你想将它转换为const char *或std :: string对象时最终调用QString的方法。你真的不需要模板。你可以使用类似的东西:

QString openStyle(const QString &type) { ... }

你的代码中还有一个非常讨厌的错误:你试图将一个const引用返回给一个局部变量,这是错误的并且会导致一个未定义的行为(很可能你会得到一个核心转储)。 正如您所看到的,我已经从const T&amp;更改了您的返回类型。到T。