是否有可能在 template
关键字和函数声明(以及可能的对象声明等)之间使用 using 别名?
template<typename trait>
using tr = base_trait<trait>
void fn(tr::type arg) { // edit: typename has to be here?
}
如果不是,我如何达到这种可读性水平?
我想出的变体并不完美:
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);
最佳答案
只需添加另一个模板参数,该参数默认为特征的 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) {
}
关于c++ - 在 "template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::type arg) { ... },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52505474/