質問

ある時なんか、僕たちのためにtypelistsには、"現代のC++のデザインかっこよかったとの組合です。を小、非関連の種類はtypelistで利用で種類以上を一度に、継承関係を示します。いたしましtypelist簡単な機能の基本の中でも、一番原始的な種類のものが入手できなかったのです。

が誰か教えてくだunterstandingのtypelistsはよくわからない場合は簡単な現実世界に例の使い方typelists毎日の平均コードについて教えてください。よろしくお願いします。

ちなみに、私が使っているWindowsおよびVisual Studio2005とそのコンパイラです。

編集:私の例ですが、みんなやっぱり使用してサンドボックスプロジェクトvsテストをつけられました。ただ静かに似コードDobbsチュートリアル:

void SomeOperation(DocumentItem* p)
{
    if (TextArea* pTextArea = dynamic_cast<TextArea*>(p))
    {
        ... operate on a TextArea object ...
    }
    else if (VectorGraphics* pVectorGraphics =
        dynamic_cast<VectorGraphics*>(p))
    {
        ... operate on a VectorGraphics object ...
    }
    else if (Bitmap* pBitmap = dynamic_cast<Bitmap*>(p))
    {
        ... operate on a Bitmap object ...
    }
    else
    {
        throw "Unknown type passed";
    }
}

この作品があると思いますか以上継承できるにも同じことを求めています。ミ鋳物なかっ原始的な種類です。利用は可能ですの戻り値としてい

typedef Typelist<int, string> mylist
mylist myfunction() {
    if(foo == bar)
        return 5;

    return "five";
}
役に立ちましたか?

解決

タイプリストは、タイプの一般的なコンパイル時のコレクションです。あなたがdynamic_castをを使用している場合は、それが静的であるので、それは、必要とするべきではありませんので、あなたは、ポイントを逃している、時間の概念をコンパイルします。

  

この作品が、私は同じことを行うことが可能である相続上の利点が表示されません。

あなたが欲しいものから、既存の型を継承することはできません。この既存の型がタイプまたはライブラリからのタイプで構築することができるので、これは、単に現実的ではありません。 (例えば、STDに::ペア)タイプのリストの拡張としてタイプリストを考える(だけでなく2)のタイプの任意の合理的な数の

タイプリストは、関数の引数のセットの周りを通過する機能を作成するために使用することができます。このタプルに保持されているオブジェクトのタイプを定義typelistに付き5つのtupeに指定された引数とパラメータ(モダンC ++設計から別の概念)(さらに別のもの)の一般的なファンクタを呼び出すコードの一部である

//functor is just a holder of a pointer to method and a pointer to object to call this 
//method on; (in case you are unfamiliar with a concept)
template<class R, class t0, class t1, class t2, class t3, class t4>
R call(Loki::Functor<R,LOKI_TYPELIST_5(t0, t1, t2, t3, t4
    )> func,
    Loki::Tuple<LOKI_TYPELIST_5(t0, t1, t2, t3, t4)> tuple)
{
    ///note how you access fields
    return func(Loki::Field<0>(tuple), Loki::Field<1>(tuple),
        Loki::Field<2>(tuple), Loki::Field<3>(tuple),
        Loki::Field<4>(tuple));
}

//this uses the example code
#include<iostream>
using namespace std;

int foo(ostream* c,int h,float z, string s,int g)
{
    (*c)<<h<<z<<s<<g<<endl;
    return h+1
}

int main(int argc,char**argv)
{
    Loki::Functor<int,LOKI_TYPELIST_5(ostream*, int, float, string, int)> f=foo;
    //(...)
    //pass functor f around
    //(...)
    //create a set of arguments
    Loki::Tuple<LOKI_TYPELIST_5(ostream*, int, float, string, int)> tu;
    Field<0>(tu)=&cout;
    Field<1>(tu)=5;
    Field<2>(tu)=0.9;
    Field<3>(tu)=string("blahblah");
    Field<4>(tu)=77;
    //(...)
    //pass tuple tu around, possibly save it in a data structure or make many 
    //specialized copies of it, or just create a memento of a call, such that 
    //you can make "undo" in your application; note that without the typelist 
    //you would need to create a struct type to store any set of arguments;
    //(...)
    //call functor f with the tuple tu
    call(f,tu);
}

唯一のタプルまたはファンクタのような他の概念とタイプリストが有用であることを始めることに注意してください。 また、私はデバッグバージョンで実行ファイルのサイズはBIG(私の記録は35メガバイトかそこらだった)になる傾向があり、プロジェクトで約2年間、ロキを経験しているため、テンプレートコード(それの多く)のされています。また、コンパイルの速度にヒットのビットがありました。また、C ++ 0xのは、おそらくいくつかの同等の機構を含むしようとしていることを思い出してください。結論:あなたが持っていない場合、タイプリストを使用しないようにしてください。

他のヒント

Typelistsることにつながるので通過"リストのパラメータは"テンプレートメタプログラム"実行"の一環として作成。

そして、できるようにするある種の"組合"タイプの一つでが使用可能です。

のための"実世界の"もの例:を使用しましたtypelistsとして生成するような、"QueryInterface方法"に自動的に実施する場合COMオブジェクトの 彗星 図書館があります。

できのようにします:

class Dog : public implement_qi<make_list<IAnimal, INoisy, IPersistStream> >
{
    // The implement_qi template has provided
    // an implementation of COM's QueryInterface method for us without
    // having to write an ugly ATL "message map" or use any Macros.
    ...
}

この例では、"make_listしたテンプレートを使用している"タイプリスト"のimplement_qiテンプレート、そして"透明性"を の適切なQueryInterfaceコード.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top