Как использовать списки типов

Попробуйте

. Для удаления вертикальной красной линии:

Tools : Options : Editor : Formatting ,

set Right Margin: 0

. да поможет вам это.

13
задан Dima 6 March 2011 в 02:57
поделиться

2 ответа

Списки типов представляют собой общие коллекции типов во время компиляции. Если вы используете dynamic_cast, вы упускаете суть, потому что это не должно быть необходимо, потому что это статическая концепция времени компиляции.

Это работает, но я не вижу преимущества перед наследованием, которое способно делать то же самое. .

Вы не можете сделать существующий тип наследованием от чего угодно. Это просто невозможно, потому что этот существующий тип может быть встроенным типом или типом из библиотеки. Подумайте о списках типов как о расширениях списков типов (например, в std :: pair) для любого разумного количества типов (вместо двух).

Списки типов можно использовать для создания средства для передачи набора аргументов к функции. Это фрагмент кода, который вызывает обобщенные функторы 5 параметров (еще одна концепция из современного дизайна 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);
}

Примечание что только с другими концепциями, такими как кортежи или функторы, списки типов начинают быть полезными. Кроме того, я испытывал Loki около 2 лет в проекте, и из-за кода шаблона (его очень много) размеры исполняемых файлов в версиях DEBUG, как правило, БОЛЬШИЕ (мой рекорд был 35 МБ или около того). Также немного снизилась скорость компиляции. Также помните, что C ++ 0x, вероятно, будет включать какой-то эквивалентный механизм. Вывод: старайтесь не использовать списки типов, если они вам не нужны.

20
ответ дан 1 December 2019 в 21:53
поделиться

Списки типов - это способ передачи "списков параметров" метапрограммам шаблонов, которые "выполняются" как часть процесса компиляции.

Таким образом, они могут использоваться для генерации некоторого вида типа "union", но это только одно возможное использование.

Для "реального" примера: мы использовали списки типов как способ автоматически генерировать метод "QueryInterface" при реализации COM-объектов в Comet Библиотека .

Она позволяла писать такой код:

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» был шаблоном, используемым для создания «списка типов», который затем можно было бы «перечислить» с помощью шаблона реализации_qi. сгенерировать соответствующий код QueryInterface .

4
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: