嵌套模板类型的别名

时间:2017-11-26 23:04:24

标签: c++ templates

我有以下代码:

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

您可以使用它来绑定特征的第一个参数,如下所示:

BIND_FIRST(std::is_same, double)

结果相当于:

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

不同之处在于,您可以内联使用它。例如:

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

这有效,但我想避免定义。我试图使用别名。但我不知道如何应用它。有没有办法替换定义?

1 个答案:

答案 0 :(得分:1)

您可以使用using模板创建别名模板,就像您对result_t所做的那样。

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

您也可以将Args...限制为单一类型T,它不必是变量。

修改:如果你的目标是减少样板,你可能想要选择这样的东西

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

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