LINUX.ORG.RU

[boost::MPI][поломка мозга] Объясните, кто может, следующий код:


0

0

Смотрю на boost::MPI. Ничего не понимаю. Вот они дают пример

template <class F, class X>
struct twice
{
 typedef typename F::template apply<X>::type once;    // f(x)
 typedef typename F::template apply<once>::type type; // f(f(x))
};
Как понимать вот это typename F::template ??? Или эта строчка понимается только целиком? Если кто знает, разъясните, в чём здесь соль.

Это чтобы объявлять типы вот в таких трехэтажных шаблонах. Почитай Template Metaprogramming или румына.

anonymous
()
Ответ на: комментарий от one_more_hokum

> Который Александреску?

Да

Читаю, но тяжко идёт.

Ну, тогда не должно быть проблем :)

Определили тип once, который есть определён как type в __шаблонном__ классе template apply<X> __шаблонного__ класса F.

Конкретно typename используется для т.н. зависимых типов.

anonymous
()
Ответ на: комментарий от anonymous

> typename используется для т.н. зависимых типов

В плюсах (в общем) и в их шаблонах (в частности) есть зависимые типы?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

Ну смотри. Чтобы облегчить себе жизнь, мы даем псевдоним некому типу. Тип этот, type, объявлен в шаблонном классе apply, который мы специализируем шаблонным аргументом X. (Видимо нам нужен именно тот type, который там будет при специализации класса apply этим Х, и ничем другим). Сам шаблонный класс apply - определен в классе F (F::template apply<>), который нам указывают параметром шаблона.

Без typename компилятор такую конструкцию не проглотит, ибо грубо говоря apply<>::type суть зависит от X.

anonymous
()
Ответ на: комментарий от anonymous

> Без typename компилятор такую конструкцию не проглотит

Это, как раз, понятно. Я пытаюсь представить, как будут выглядеть классы apply и конкретизирующий F.

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

>Я пытаюсь представить, как будут выглядеть классы apply

template <class T> class apply {
public:
    typedef sometype type;
};

>и конкретизирующий F

По представленному в ОП куску кода могу только сказать, что как угодно.

anonymous
()
Ответ на: комментарий от anonymous

>>и конкретизирующий F

По представленному в ОП куску кода могу только сказать, что как угодно

Охжёпта, с Х перепутал. F может выглядеть так:

class F {
public:
    template <class T> class apply { 
    public: 
        typedef sometype type; 
    };
};
anonymous
()
Ответ на: комментарий от anonymous
template <class T>
class apply
{ 
public: 
 typedef sometype type; 
};

А нафея там тогда вообще шаблон, если T никак не используется???

Я думал, что-то вроде

template <typename T>
struct apply
{
 typedef T type;
};
one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

>А нафея там тогда вообще шаблон, если T никак не используется???

Это у меня в демонстрационном примерчике он не используется. В Бусте он естественно используется.

Я думал, что-то вроде

И так тоже может быть. Мой примерчик реализует тот минимальный интерфейс, при котором код в ОП - валиден.

И, да, надеюсь после прочтения Александреску ты положишь прибор на плюсы и начнёшь писать на каком-нибудь более кошерном языке, как я. Например, на Smalltalk :)

anonymous
()
Ответ на: комментарий от anonymous

> надеюсь после прочтения Александреску ты положишь прибор на плюсы и начнёшь писать на каком-нибудь более кошерном языке

Пока я надеюсь лишь на то, что после прочтения всяких Александреску меня не увезут в дурдом. :-)

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от anonymous

То есть, F::template говорит о том, что apply, лежащий внутри F — шаблонный класс? А разве по <X> после apply компилятор это распознать не сможет?

one_more_hokum ★★★
() автор топика
Ответ на: комментарий от one_more_hokum

>А разве по <X> после apply компилятор это распознать не сможет?

Конечно может, по крайней мере у меня gcc 4.4.4 аналогичный пример скомпилировался и с-, и без-. Только вот помимо g++ есть ещё зоопарк других компиляторов, а у тех же MS вообще своё понятие о стандарте :) Как-то так.

anonymous
()
Ответ на: комментарий от one_more_hokum

Никогда не пользуйся бустом и всегда будешь спать крепко!

Pantserovik
()
Ответ на: комментарий от anonymous

Конечно может, по крайней мере у меня gcc 4.4.4 аналогичный пример скомпилировался и с-, и без-. Только вот помимо g++ есть ещё зоопарк других компиляторов, а у тех же MS вообще своё понятие о стандарте :)

В данном случае у МС более строгое соответствие стандарту - вариант без ::template Visual C++ (по-крайней мере версии 9) не воспримет.

Begemoth ★★★★★
()
Ответ на: комментарий от one_more_hokum

надеюсь после прочтения Александреску ты положишь прибор на плюсы и начнёшь писать на каком-нибудь более кошерном языке

Пока я надеюсь лишь на то, что после прочтения всяких Александреску меня не увезут в дурдом. :-)

после румына почитай исходники stl (только подойди к вопросу серьёзно - не просто читай, а, например, попробуй реализовать свой велосипед на основе), и бери stl не sgi'ный (хотя можно и его), а поновее от microsoft или те что в gcc

после снова почитай румына - поймёшь что румын мелковат (хаков и трюков маловато), хотя и хорош :)))

shty ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.