2014-01-26 204 views
0

所以,我可以做到以下幾點:C++模板類聲明

template<typename T> 
void printValue(T theValue) 
{ 
    std::cout << theValue; 
} 

int main() 
{ 
    /..... 
    int value = 5; 
    printValue(value); 

    return 0; 
} 

但是,如果我想要做一類以下內容:

template<class Type_T> 
class Foo { 

    public: 
     template<typename Inverse> 
     Foo(Inverse begin, Inverse end) 
     : values(begin, end) 
     { 



     } 

    protected: 

     std::vector<Type_T> values; 
}; 

int main() { 

    std::vector<int> va = {1, 2, 3, 4, 5, 6}; 

    Foo<int> f(va.begin(), va.end()); 

    return 0; 
} 

我必須聲明的類型。通過了解正在傳遞的迭代器的類型,編譯器是否有辦法確定類型?

回答

6

您可以創建給出輔助函數make_foo()從參數推斷類型:

template<typename U> 
Foo<typename U::value_type> make_foo(U first, U last) 
{ 
    return { first, last }; 
} 

auto f = make_foo(va.begin(), va.end()); 
+0

將在'自動F =由當載體是在類中make_foo'? – Phorce

+0

@ user1326876不,你會在你想使用'Foo'對象的地方調用它。 'make_foo'返回'Foo '對象,其中'U'自動從參數中推導出來。 'auto'是C++ 11引入的一個關鍵字,意思是:「根據我賦給我的變量推導類型」。 – Paranaix