2011-10-24 10 views
4

基本的に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

FYI、 'boost :: function <>'は1つのテンプレート引数をとります。 – 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

これは私が欲しい、ありがとう!私はおそらく私はすべてのテンプレートを自動生成するためにブーストプリプロセッサを使用することができると思いますか?これらのテンプレートを手作業で書くのは間違いやすい – Jason

関連する問題