2011-10-24 67 views
4

我想使用boost預處理器來聲明具有不同模板變量長度的模板類,基本上就像boost :: function所做的那樣。boost :: function支持如何使用不同長度模板參數的模板類

#if !BOOST_PP_IS_ITERATING 

#ifndef D_EXAMPLE_H 
#define D_EXAMPLE_H 
#include <boost/function> 
#include <boost/preprocessor/iteration/iterate.hpp> 
#define BOOST_PP_ITERATION_PARAMS_1 (3, (1, 2, "example.h")) 
#include BOOST_PP_ITERATE() 

#else 
template<class T, BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), class T)> 
class Example 
{ 
    boost::function<T, (BOOST_PP_ENUM_PARAMS(BOOST_PP_ITERATION(), T))> func; 
}; 
#endif 

上面的代碼顯然是行不通的,因爲它宣稱在同一個頭文件有不同的模板可變長度相同的類。我想要實現的是包含一個文件,並像boost :: function一樣定義具有不同模板變量長度的類。

#include "example.h" 
Example<int, int, float> example1; 
Example<double, int> example2; 

我擡頭看看boost :: function的代碼,但我無法弄清楚它是如何工作的。有任何想法嗎?

+0

變量模板不會爲你做? –

+0

我在VS2010的工作,它不支持可變參數模板 – Jason

+0

僅供參考,'的boost ::功能<>'需要一個(也是唯一一個)模板參數。 – ildjarn

回答

1

您需要首先聲明大部分參數的模板類,其中除了第一個參數以外的所有參數都使用默認值。然後可以將具有較少參數的模板類定義爲主模板類的特化。例如:

#include <iostream> 

template<class A, class B = void, class C = void> 
class Example 
{ 
public: 
    static const int x = 3; 
}; 

template<class A, class B> 
class Example<A, B, void> 
{ 
public: 
    static const int x = 2; 
}; 

template<class A> 
class Example<A, void, void> 
{ 
public: 
    static const int x = 1; 
}; 

int main() 
{ 
    Example<int, int, int> e3; 
    Example<int, int> e2; 
    Example<int> e1; 
    std::cout << e3.x << e2.x << e1.x << std::endl; 
} 
+0

這是我想要的,謝謝!但我想也許我可以使用boost預處理器自動生成所有模板?手動編寫這些模板是很容易出錯的 – Jason

相關問題