无法比较具有固定数量参数的两个模板模板类型
Failing to compare two template template types with fixed number of arguments
我有一个 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 检查过)
最初的问题是在类型列表中找到指定的class满足模板模板类型相等的条件。
Neither 应该工作:GCC 有一个有用的错误,如果别名模板足够相似,它认为别名模板与基础模板相同。 fixed/variadic 不匹配,虽然在实践中仍然可用,但足以让它恢复到一致的行为。
我有一个 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 检查过)
最初的问题是在类型列表中找到指定的class满足模板模板类型相等的条件。
Neither 应该工作:GCC 有一个有用的错误,如果别名模板足够相似,它认为别名模板与基础模板相同。 fixed/variadic 不匹配,虽然在实践中仍然可用,但足以让它恢复到一致的行为。