c++ - Type_traits *_v 变量模板实用程序顺序编译失败

标签 c++ templates template-specialization variable-templates

看过this answer ,我尝试为其中的代码提供一个变量模板实用程序:

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

并像这样实现它:

template <template <class...> class Template, class... Args>
constexpr bool is_specialization_v = is_specialization<Template<Args...>, Template>::value;

因为这就是我在<type_traits>的头文件中看到类似实用程序的实现方式。 。例如:

template <typename _Tp, typename _Up>
  inline constexpr bool is_same_v = is_same<_Tp, _Up>::value;
template <typename _Base, typename _Derived>
  inline constexpr bool is_base_of_v = is_base_of<_Base, _Derived>::value;
template <typename _From, typename _To>
  inline constexpr bool is_convertible_v = is_convertible<_From, _To>::value;

等等。 (来自MinGWGCC 8.2.0实现)

但问题是,虽然::value语法似乎有效, *_v语法不:

int main() {
    bool foo = is_specialization<std::vector<int>, std::vector>::value; // No problem
    bool bar = is_specialization_v<std::vector<int>, std::vector>;      // compilation error!

    std::cout << foo << ' ' << bar;
}

这会产生以下错误:

error: type/value mismatch at argument 1 in template parameter list for 'template<template<class ...> class Template, class ... Args> constexpr const bool is_specialization_v<Template, Args ...>'
 bool bar = is_specialization_v<std::vector<int>, std::vector>;      // compilation error!
            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
note:   expected a class template, got 'std::vector<int>'
error: type/value mismatch at argument 2 in template parameter list for 'template<template<class ...> class Template, class ... Args> constexpr const bool is_specialization_v<Template, Args ...>'
expected a type, got 'vector'

这是为什么呢?老实说,这个错误对我来说似乎很公平,并让我思考上述答案中的代码到底是如何工作的。它期望 class模板和参数包,但它给出了一个 class ,然后是一包。另一方面,它专门研究这两种类型的组合,这让我有点困惑。我想知道:

  • 这里的扣除流程是怎样的?链接的答案没有详细说明代码的工作原理。
  • 如何介绍*_v在这种情况下可变模板实用程序?

最佳答案

让我们比较一下变量的模板参数...

template <template <class...> class Template, class... Args>
constexpr bool is_specialization_v = is_specialization<Template<Args...>, Template>::value;

论点

is_specialization_v<std::vector<int>, std::vector>

您声明它首先接受一个模板,然后传递一个类型。然后您声明它接受类型包,但现在您传递一个模板。问题在于您感到困惑并像对主要特征进行专门化一样实现变量。它不接受参数作为参数传递以放置在特化中。它需要接受与主节点相同的参数,然后转发它们:

template <class T, template <class...> class Template>
constexpr bool is_specialization_v = is_specialization<T, Template>::value;

关于c++ - Type_traits *_v 变量模板实用程序顺序编译失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58027884/

相关文章:

c++ - 如何自定义打开/保存文件对话框?

c++ - dlopen 期间 undefined symbol

c++ - 首先将名称存储在变量中时,如何命名类?

c++ - ')' 标记之前的预期主表达式(需要 "template"消歧器)

c++ - 在模板化之前使用隐式转换

c++ - 为什么此代码会出现错误 "template specialization requires ' template< >'"?

c++ - 如何在 iOS 上的 QT/QML 中使用剪贴板

c++ - 我应该如何在使用 C++ 模板创建的类之间进行转换?

c++ - 模板函数的参数不进行任何隐式转换

c++ - 区分用户和非用户类型和模板特化