2012-01-03 23 views
1

私はtype-visiatorをC++タイプリストよりも実装する方法を探しています。ここでは、タイプビジターの型に対して特定の演算子(sizeofなど)を実行するための型ビジターを意味しました。タイプビジターをC++で入力してください

概念的には私が何をしたいです。もちろん

typedef TYPELIST_3(bool, int, double) tl; 
size_t tl_size  = TL_sum_size<tl>(); // 13 = 1+4+8 
size_t tl_min_size = TL_min_size<tl>(); // 1 
size_t tl_max_size = TL_max_size<tl>(); // 8 
vector<size_t> tl_sizes = TL_list_size<tl>(); // {1, 4, 8} 
TL_AddCounter<tl>(3); // Call AddCounter(3) for each type in typelist 

、各機能はtypelistにかけtempletizedする必要があります。 この例では、タイプリストにsizeofとstatic void T::addCounter(int x)を使用しています(タイプが何回使用されたかを追跡するため)。 一般的には、任意のパラメータを持つ型について任意の「静的」操作を実行したいと考えています。

まず、上記のいずれかの機能は可能ですか?はいの場合、どうすればいいですか?タイプリストを反復する方法がわかりません。このような

+0

[1] [1] を[私はtypelistに基づいて私のバリアントの実装でのMaxSizeと長さを使用]:http://stackoverflow.com/questions/2150892/how-to-build-this- c-typelist-a-variant/3552166#3552166 –

答えて

1

何かがうまくいくかもしれない:

#include <type_traits> 

template <typename T> 
struct SizeVisitor : std::integral_constant<unsigned int, sizeof(T)> { }; 

template <template <typename> class Visitor, typename ...Args> struct Visit; 

template <template <typename> class Visitor, typename T, typename ...Rest> 
struct Visit<Visitor, T, Rest...> : std::integral_constant<unsigned int, 
    Visitor<T>::value + Vist<Visitor, Rest...>::value> { }; 

template <template <typename> class Visitor> 
struct Visit<Visitor, T> : std::integral_constant<unsigned int, 0U> { }; 

今、あなたはVisit<SizeVisitor, double, char, int>::valueを言うことができます。

あなたがあなたの代わりにタイプリストの裸のタイプの単一(たとえばtuple)クラスを取るために、このアプローチを変更することができ、あなたはまた、いくつかの任意のバイナリ数子にSizeVisitorを一般化することができ、std::accumulateに似(と代わりに0uのアキュムレータのニュートラルな要素があります)。

+0

非常に速い答えをありがとう。これは確かにsum_sizeで機能します。私はこれが同様のケースでうまくいくはずだと思います。しかし、これは静的void T :: AddCounter(int x)で機能しますか?また、std :: integral_constantはC++ 11用です。 C++ 03でも同じことができますか? – xosp7tom

+0

@ xosp7tom: 'integral_constant'は' static const'整数メンバ 'value'を持つちょっとしたクラスです。これを10秒で手書きで書くことも、適切な 'value'メンバーを定義することもできます。ちなみに、C++ **は** C++ 11 ;-)です。また、すべての可変テンプレートはC++ 11です。あなたは真剣にC + +03のような何かを書くのはもっと面倒でなければならないでしょう。 –

+0

@ xosp7tom: "それぞれのタイプのものを呼び出す"ものを書くのはとても簡単です。パーシャルスペシャライゼーションとパック展開をエミュレートするだけです。すべてが完了することができます。あなたが特定の事件の詳細を知りたいのなら、私に知らせてください。 –

関連する問題