c++ - 在 "template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::type arg) { ... }

标签 c++ templates

是否有可能在 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/

相关文章:

html - Go html模板访问范围内的结构字段

c++ - 哪个是更专业的模板功能? clang 和 g++ 对此有所不同

c++ - boost spirit 业力真实发电机性能

c++ - 有人可以解释 openssl cli 和 c++ DES 输出的区别吗

c++ - 在下面的static_strlen 实现中,为什么需要用& 和括号括住str?

azure - 通过 Powershell Runbook 从 ARM 模板部署 Azure VM,无需下载模板

带有模板的c++类找不到它的构造函数

Javascript 模板引擎。使用理由

c++ - 在QT中读取窗口的注册表

c++ - 为自定义编辑控件分配内存的最佳方式?