2013-04-12 89 views
0
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方法,如果QString類的一些參數替代%1%2,...。參數可以是int,char *,double和QString支持的任何值,但不能是std::string。將std::string傳遞給message函數是非常方便的。我無法專門爲std::string專門設計,因爲它的順序沒有定義。它可能是第一,第二,...如何將`std :: string`傳遞給`QString`` arg`方法?

我認爲它應該是一個模板結構,它將使用.c_str()方法將std::string轉換爲QString。誰可以幫助寫作呢?

回答

2

如何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)); 
+0

但通過INT例如當它應該如何工作。它應該是模板的其他類型的工作 – Ashot

+0

@Ashot你可以重載你的模板方法用於字符串... – ForEveR