Stringify и Unstringify шаблонных аргументов - PullRequest
1 голос
/ 07 января 2011

предположим, у меня много классов с их "* Pack" аналогами в именовании.Например, если у меня есть класс Moo, у меня есть MooPack, если у меня есть Foo, у меня также есть FooPack.

Я хочу иметь шаблонную функцию c ++, которая возвращает FooPack из Foo

template <class X, class XPack>
XPack packify(X input){
   ...
}

Возможно ли это сделать без указания аргумента шаблона?На данный момент это должно быть сделано следующим образом:

Moo moo;
MooPack mooppey = packify<Moo, MooPack>(moo);

Если требуется только аргумент шаблона Moo, этот бит спецификации уродливого шаблона может уйти, но кроме использования #defines, которое не 'Это действительно лучшее решение, но оно до сих пор не сделано.

Есть ли способ, или мне придется ждать c ++ 0x?

Ответы [ 2 ]

5 голосов
/ 07 января 2011

Вам не нужно указывать Moo, просто MooPack, потому что moo выведет аргумент для вас. Однако я бы посоветовал вам сделать MooPack typedef или вложенным классом (называемым Pack) внутри самого Moo, и в этом случае вы можете легко получить к нему доступ с помощью typename X :: Pack внутри шаблона.

class Moo {
public:
    class Pack {
        ...
    };
};
template<typename T> typename T::Pack packify(T t) {
    ...
}

// usage

Moo m;
Moo::Pack p = packify(m);
1 голос
/ 08 января 2011

Как уже упоминалось в ответе DeadMG, вам не нужно явно указывать тип параметра, так как он может быть выведен автоматически (если это второй, а не первый параметр шаблона).Так как вы сказали, что вы не можете изменить объявления типов, чтобы сформировать связь между классами, я бы предложил маршрут для этого (думаю, std :: iterator_traits):

template<typename T> struct pack_traits;
template<> struct pack_traits<Moo> { typedef MooPack Pack; };
...//traits for other packifable classes

template<typename T> pack_traits<T>::Pack packify(T val){...}
...
Moo moo;
MooPack mooppey = packify(moo);

Таким образом, вы можете вызватьфункция без указания аргументов шаблона вручную, без необходимости изменения самих классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...