【发布时间】:2020-04-29 21:34:57
【问题描述】:
有人可以用模板参数包解释下面的代码吗? 它是如何工作的?这种情况下模板参数是如何打包和解包的:
template<typename Test, template<typename...> class Ref> //#6
struct is_specialization : std::false_type {};
template<template<typename...> class Ref, typename... Args> //#7
struct is_specialization<Ref<Args...>, Ref>: std::true_type {};
可能的请求用法(灵感来自Function Template Overloading or Specialization for inner template type std::vector<std::vector<T>>)
template <typename T>
bool f(T& x) // #1
{
std::cout << "body of f\n";
return f(x);
}
template <typename T>
bool f(std::vector<T>& v) // #2
{
std::cout << "body of f for vectors\n";
return true;
}
template<typename T>
typename std::enable_if<
is_specialization<typename T::value, std::vector>::value, T>::type
bool f(std::vector<T>& v) // #5
{
std::cout << "body of f for vectors<vectors>\n";
return true;
}
int main() {
std::vector<int> v{1,2}
f(v);
}
【问题讨论】:
-
我很困惑。 #2 应该无条件地绑定,因为这是这里的最佳匹配。 #5 甚至没有在这里发挥作用,不包括任何和所有 SFINAE。你到底有什么不清楚的地方?抛开#5 甚至不应该编译的问题,除非你的意思是
template<typename T, typename = std::enable_if<is_specialization<typename T::value, std::vector>::value, T>::type>。 -
@TanveerBadar:您能否参考给出的链接中的完整代码。我已对问题进行了编辑。请看一看。
-
@TechTotie 您到底需要澄清什么?
is_specialization定义的哪一部分你不明白? -
@walnut 请让我知道#5 的工作原理以及 is_specialization 是如何工作的 w.r.t 模板参数打包和解包。
标签: c++ variadic-templates template-specialization parameter-pack