2
class StringResourceTable
{
private:
    StringResourceTable();

public:
    static StringResourceTable& instance();

    void configure(const QString& path);
    QString message(const QString& id) const;

    template <typename T1>
    QString message(const QString& id, T1 a1) const
    {
        return message(id).arg(a1);
    }

    template <typename T1, typename T2>
    QString message(const QString& id, T1 a1, T2 a2) const
    {
        return message(id).arg(a1).arg(a2);
    }

    template <typename T1, typename T2, typename T3>
    QString message(const QString& id, T1 a1, T2 a2, T3 a3) const
    {
        return message(id).arg(a1).arg(a2).arg(a3);
    }

private:
    QString m_path;
    QMap<QString, QString> m_map;
}

このコードでは、argメソッド ifQStringクラスを使用して%1、 , %2, ... をいくつかのパラメータで置き換えています。パラメータは、int、char*、double など、QStringサポートされているものであれば何でもかまいませんが、std::string. std::string関数のいずれかに渡すと非常に便利messageです。std::string順序が定義されていないため、特殊化できません。それは最初、2番目、...

std::stringメソッドをQString使用するように変換されるテンプレート構造体であるべきだと思います.c_str()。誰がそれを書くのを手伝ってくれますか?

4

1 に答える 1

3

fromStdString関数はどうですか?

ただし、次のようなものを使用できます

template<typename T>
const T& convert(const T& v)
{
   return v;
}

QString convert(const std::string& s)
{
   return QString::fromStdString(s);
}

のように使用します

return message(id).arg(convert(a1));
于 2013-04-12T13:22:27.010 に答える