Использование между «шаблоном» и объявлением функции: шаблониспользуя tr = base_trait <trait>void fn (tr :: type arg) {...} - PullRequest
0 голосов
/ 25 сентября 2018

Возможно ли как-то использовать псевдоним между ключевым словом template и объявлением функции (и, возможно, объявлением объекта и т.

Варианты, которые я придумал, не идеальны:

template<typename trait>
struct base_trait : trait {
    using thetype = typename trait::thetype;
};


struct int_trait {
    using thetype = int;
};


/* the pretty version which doesn't compile */
template <typename trait>
using tr = base_trait<trait>. 

void fn(tr::thetype arg) {
    // tr::

}

fn<int_trait>(1);


/* ugly long arglist version which works */
template <typename trait>
void fn(typename base_trait<trait>::thetype arg1, typename base_trait<trait>::thetype arg2) {
    using tr = base_trait<trait>; 

    // tr:: 
}

fn<int_trait>(1);


/* another boilerplate version that still requires `typename` */
template <typename tr>
void fn(typename tr::thetype arg) {
    // typename tr::  

    // wait, I have to type and read typename everywhere... (unless I add `using boilerplateusing = tr; edit: this using should not help?)
}

template <typename trait>
using boilerplateusing = fn<base_trait<trait>>;

boilerplateusing<int_trait>(1);

1 Ответ

0 голосов
/ 25 сентября 2018

Просто добавьте еще один параметр шаблона, который по умолчанию используется для элемента type черты, например

template<typename trait, typename arg_t = typename base_trait<trait>::thetype> 
void fn(arg_t arg) {

} 

, или, если вы хотите сохранить тип черты, вы можете использовать

template<typename trait, typename tr = base_trait<trait>> 
void fn(typename tr::thetype arg) {

}

иливы можете получить как с

template<typename trait, 
         typename tr = base_trait<trait>,
         typename arg_t = typename tr::thetype> 
void fn(arg_t arg) {

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