我有以下代码:
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)>;
这有效,但我想避免定义。我试图使用别名。但我不知道如何应用它。有没有办法替换定义?
答案 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>;