簡體   English   中英

如何為STL容器指定模板功能?

[英]How to specify template function for STL container?

我需要將不同類型的值寫入std::wstringstream 有一段時間我們需要寫出一個或多個值。 我試圖像這樣實現它:

wstringstream _str;     

template<typename ValueType> //(1)
void WriteValue(const ValueType& val)
{
    _str << val;
}

template<typename ValueType> //(2)
void WriteValue(const std::vector<ValueType>& vals)
{
    for (auto it = vals.begin(); it!= vals.end(); ++it)
    {
        WriteValue<ValueType>(*it);
        _str << L" ";            
    }
}

template<typename ValueType>
void WriteRecord(const std::wstring& name, const ValueType & val)
{
     _str << name;
     WriteValue<ValueType>(val);
}

void Foo()
{
    int bar = 0;
    WriteRecord<int>(L"Lorem", bar); //it's okay

    std::vector<int> buz(4, 0);
    WriteRecord<int>(L"ipsum", buz); //it's error
}

我收到以下錯誤:

"cannot convert argument 2 from 'std::vector< int, std::allocator < int > >' 
to 'int &'". As seen compiler tries to pass a vector to (1), not (2).

為什么這樣? 是否可以選擇(2)專門的功能模板?

WriteRecord<int>(L"ipsum", buz);
           ^^^^^

在這里你明確地說ValueType應該是一個int 所以函數簽名是:

void WriteRecord(const std::wstring& name, const int& val)

當您嘗試將std::vector作為第二個參數傳遞時,編譯器無法將std::vector轉換為int

對於函數,很少需要顯式地命名模板參數的類型,您編寫這樣的調用將起作用:

WriteRecord(L"ipsum", buz); //Compiler deduces ValueType

如果確實需要指定模板參數,請使用decltype

WriteRecord<decltype(buz)>(L"ipsum", buz);

或者只寫出來(不推薦)

WriteRecord<std::vector<int>>(L"ipsum", buz);
std::vector<int> buz(4, 0);
WriteRecord<int>(L"ipsum", buz);
//          ^^^

你告訴編譯器ValueTypeint但是你傳遞vector<int>作為參數。 編譯器完全能夠推導出模板參數類型,因此請不必要地在任何地方停止指定它們。 你的Foo函數應如下所示:

void Foo()
{
    int bar = 0;
    WriteRecord(L"Lorem", bar);

    std::vector<int> buz(4, 0);
    WriteRecord(L"ipsum", buz);
}

同樣,在其他函數的WriteValue調用中刪除顯式指定的模板參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM