简体   繁体   English

嵌套模板类型的别名

[英]alias for nested template type

I have the following code: 我有以下代码:

template <template <typename, typename...> typename trait_t, typename arg_t>
struct BindFirst
{
    template <typename... arg_ts>
    using result_t = trait_t<arg_t, arg_ts...>;
};

#define BIND_FIRST(trait_t, arg_t) BindFirst<trait_t, arg_t>::template result_t

you can use it to bind the first argument of a trait like this: 您可以使用它来绑定特征的第一个参数,如下所示:

BIND_FIRST(std::is_same, double)

The result is equivalent to: 结果等于:

template <typename T>
struct IsInt : std::is_same<double, T> { };

The difference is, that you can use it inline. 区别在于您可以内联使用它。 For example like this: 例如这样:

using result_t = find_t<type_list, BIND_FIRST(std::is_same, double)>;

This works but i like to avoid the define. 这可行,但我想避免定义。 I tried to use an alias. 我试图使用别名。 But I have no idea how to apply it. 但是我不知道如何应用它。 Is there any way to replace the define? 有什么方法可以代替定义吗?

You can use templates with using to create an alias template, just like you did for result_t . 您可以将模板与using一起using以创建别名模板,就像对result_t所做的一样。

template <typename... Args>
using IsDouble = BindFirst<std::is_same, double>::template result_t<Args...>;

You can limit the Args... to a single type T as well, it doesn't have to be variadic. 您也可以将Args...限制为单个T ,也不必是可变的。

Edit: If your goal is to reduce boilerplate, you may want to opt for something like this 编辑:如果您的目标是减少样板,您可能想要选择这样的东西

template <typename T, typename U>
using IsSameAs = std::is_same<T, U>;

template <typename T>
using IsDouble = IsSameAs<double, T>;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM