我有一个SFINAE模板版本的is_same
用于比较模板模板参数。它通常在具有固定和可变数量模板参数的模板上按预期工作:
namespace eld::util::traits
{
template<template<typename...> class ATT, template<typename...> class BTT>
struct is_same_tt : std::false_type
{
};
template<template<typename...> class TT>
struct is_same_tt<TT, TT> : std::true_type
{
};
}
template<typename AT, typename BT, typename CT>
struct fixed_args_number
{
};
template<typename...>
struct variadic_args
{
};
static_assert(eld::util::traits::is_same_tt<fixed_args_number, fixed_args_number>(), "");
static_assert(eld::util::traits::is_same_tt<variadic_args, variadic_args>(), "");
但是当我比较具有固定数量模板参数的模板模板和成员模板模板时,我得到false
,虽然true
,当参数是可变的。
template<template<typename...> class TT>
struct designated
{
template<typename... T>
using tt_type = TT<T...>;
};
// Does not compile
//static_assert(
// eld::util::traits::is_same_tt<fixed_args_number, designated<fixed_args_number>::tt_type>(),
// "");
static_assert(eld::util::traits::is_same_tt<variadic_args, designated<variadic_args>::tt_type>(),
"");
原因是什么?(我只用MinGW64检查过)
最初的问题是在类型列表中找到满足模板模板类型相等条件的指定类。
应该起作用:GCC有一个有用的错误,如果别名模板与底层模板足够相似,它会认为它们是相同的。固定/可变不匹配,虽然在实践中仍然可用,但足以使其恢复到一致的行为。