2014-09-24 112 views
0

如何在不爲每種類型編寫一行代碼的情況下使用不同的數據類型?數據類型調用模板方法

說出是否存在採用任何數據類型的模板方法。 我想傳遞各種數據類型(int,double,string,char,...等),而不必爲每種數據類型創建一行。 是否有一種循環不同數據類型併爲每種數據類型調用模板方法的有效方法?

示例代碼:

template <typename T> 
sorted_vector<T>::sorted_vector(sorted_vector<value_type> const& rhs) 
    : beg_(new value_type [rhs.size()]) 
    , end_(beg_ + rhs.size()) 
    , cap_(end_) 
{ 
    std::copy(rhs.beg_, rhs.end_, beg_); 
} 

所以,我的任務是測試用錯誤的模板,但要檢查所有value_types。 而我想測試一個矢量,矢量,矢量等等

+0

我真的不明白這個問題。模板方法是在編譯時爲您插入的類型構建的。您能以代碼的形式給出一個小例子嗎? – tgmath 2014-09-24 16:21:30

+0

說明您希望如何使用模板方法的示例代碼將很有用。 – 2014-09-24 16:22:55

+0

我上傳了我的示例代碼 – Jarvis 2014-09-24 16:28:06

回答

0

很難理解你真正問的問題,因爲你的問題太寬泛。我會建議查看boost::variant,特別是如何實現模式「訪問者」。這並不意味着你必須使用這個庫,但這可能是一個很好的起點,如何實現這樣的邏輯。

class Test 
{ 
public: 
    template <typename T> 
    static void f() 
    { 
     // Your generic code to execute 
     std::cout << typeid(T).name() << std::endl; 
    } 
}; 

template<typename F, typename ... Ts> 
void Call() 
{ 
    std::initializer_list<int>({ (F::template f<Ts>(), 0)... }); 
} 

然後調用它的方式::其他候選人使用可變參數模板是std::tupleboost::any

1

您可以循環

Call<Test, int, char, char*>(); 

但我不知道它是更清除比

// Equivalent to 
Test::f<int>(); 
Test::f<char>(); 
Test::f<char*>(); 
0

聽起來像一個案例模板元編程。 看Boost的MPL的的foreachforeach

他們的榜樣確實像您嘗試這樣做:呼喚不同類型和列表值的仿函數。

struct value_printer 
{ 
    template< typename U > void operator()(U x) 
    { 
     std::cout << x << 'n'; 
    } 
}; 

int main() 
{ 
    for_each< range_c<int,0,10> >(value_printer()); 
}