Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查类是否等于模板实例或普通类_C++_Templates_C++11 - Fatal编程技术网

C++ 检查类是否等于模板实例或普通类

C++ 检查类是否等于模板实例或普通类,c++,templates,c++11,C++,Templates,C++11,我有一个积分_常量,用于确定一个类是否在提供的类列表中: template <typename T> using decay_t = typename std::decay<T>::type; template <typename... Args> struct SOneOf : std::integral_constant<bool, false> { }; template <typename T1, typename T2, typ

我有一个
积分_常量
,用于确定一个类是否在提供的类列表中:

template <typename T> using decay_t = typename std::decay<T>::type;

template <typename... Args> struct SOneOf : std::integral_constant<bool, false>
{
};

template <typename T1, typename T2, typename... Tail> struct SOneOf<T1, T2, Tail...>
    : std::integral_constant<bool, SOneOf<T1, T2>::value || SOneOf<T1, Tail...>::value>
{
};

template <typename T1, typename T2> struct SOneOf<T1, T2>
    : std::integral_constant<bool, std::is_same<decay_t<T1>, decay_t<T2>>::value>
{
};

template <typename T> struct SOneOf<T> : std::integral_constant<bool, false>
{
};

如果您试图在函数模板中获取该信息,可以使用部分专门化:

template <bool...> struct bool_pack;
template <bool... B>
using any_true = std::integral_constant<bool,
  !std::is_same<bool_pack<false, B...>, bool_pack<B..., false>>{}>;

namespace detail {
  template <template <class...> class, typename>
  struct IsSpec : std::false_type {};
  template <template <class...> class T, typename... U>
  struct IsSpec<T, T<U...>> : std::true_type {};
}

template <typename U, template <class...> class... T>
using IsSpecialization = any_true<detail::IsSpec<T, std::decay_t<U>>{}...>;

问题更多的是如何在查询中混合完整和不完整类型。如问题所示:
SOneOf::value
。所以你没有回答。@galop1n这是胡说八道,无论如何也不能灵活处理(我想你指的是“不完整类型”的模板?在C++的上下文中,这是两件不同的事情)。不过,我提供了一种使用多个模板进行检查的方法,然后可以单独执行附加检查。@galop1n Well。。第一个版本帮助了我,虽然它不是通用的,而第二个版本回答了我的问题,但没有帮助我(因为答案是,这是不可能的)。因此,我假设(Columbos原始答案和您的答案)都是正确的:)@Uroc327好吧,您只需编写
IsSpecialization{}}| | std::Isu与布尔表达式相同{}
,甚至可以将其放入自己的模板中。这就是我的意思。
CClassA
CClassB
都不是类。。。
SOneOf<TF, CClassA, CClassB, float>::value
template <bool...> struct bool_pack;
template <bool... B>
using any_true = std::integral_constant<bool,
  !std::is_same<bool_pack<false, B...>, bool_pack<B..., false>>{}>;

namespace detail {
  template <template <class...> class, typename>
  struct IsSpec : std::false_type {};
  template <template <class...> class T, typename... U>
  struct IsSpec<T, T<U...>> : std::true_type {};
}

template <typename U, template <class...> class... T>
using IsSpecialization = any_true<detail::IsSpec<T, std::decay_t<U>>{}...>;
static_assert( IsSpecialization<CClassB<int>, CClassA, CClassB>{}, "" );
static_assert( !IsSpecialization<void, CClassA, CClassB>{}, "" );
template <typename Arg>
void f( CClassA<Arg> const& obj ) { /* … */ }
template <typename Arg>
void f( CClassB<Arg> const& obj ) { /* … */ }