Type_traits *_v 变量模板实用命令编译失败
Type_traits *_v variable template utility order fails to compile
看过 后,我试图为其中的代码提出一个 变量模板 实用程序:
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;
等(GCC 8.2.0 来自 MinGW 的实现)
但问题是,虽然 ::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
模板 和一个参数包,但给定的是 a class
,然后是一个参数包。另一方面,它专门研究这两种类型的组合,这让我有点困惑。我想知道:
- 这里的推导过程是怎样的?链接的答案没有详细说明代码的工作原理。
- 如何在这种情况下引入
*_v
变量模板实用程序?
变量模板应具有与原始模板相同的模板参数:<class T, template <class...> class Template>
。我不确定您为什么改用专业化中的模板参数。
它应该是这样的:
template <class T, template <class...> class Template>
constexpr bool is_specialization_v = is_specialization<T, Template>::value;
让我们比较一下变量的模板参数...
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;
看过
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;
等(GCC 8.2.0 来自 MinGW 的实现)
但问题是,虽然 ::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
模板 和一个参数包,但给定的是 a class
,然后是一个参数包。另一方面,它专门研究这两种类型的组合,这让我有点困惑。我想知道:
- 这里的推导过程是怎样的?链接的答案没有详细说明代码的工作原理。
- 如何在这种情况下引入
*_v
变量模板实用程序?
变量模板应具有与原始模板相同的模板参数:<class T, template <class...> class Template>
。我不确定您为什么改用专业化中的模板参数。
它应该是这样的:
template <class T, template <class...> class Template>
constexpr bool is_specialization_v = is_specialization<T, Template>::value;
让我们比较一下变量的模板参数...
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;