G. *_*dam 5 c++ metaprogramming
假设我需要创建一个接受新类型的类型,就像容器的工作方式一样。
如果没有 Push_back 类型使用模板专业化,我可以实现同样的事情吗?
#include <iostream>
template <typename...>
struct type_list {};
template <typename T>
struct my_type { using type = T; };
template <typename LIST, typename T>
struct push_back;
template <typename... Args, typename T>
struct push_back<type_list<Args...>, T> : my_type<type_list<Args..., T>>
{
};
template <typename LIST, typename T>
using push_back_t = typename push_back<LIST, T>::type;
int main()
{
type_list<int, bool> x;
push_back_t<decltype(x), float> y;
type_list<int, bool,float> z;
std::cout << std::is_same_v<decltype(y), decltype(z)> << '\n';
}
Run Code Online (Sandbox Code Playgroud)
您可以将其设为函数模板以避免专业化并使其更好用:
\ntemplate<typename T, typename... Args>\nauto push_back(type_list<Args...>) {\n return type_list<Args..., T>{};\n}\n\n...\n\nauto y = push_back<float>(x);\nRun Code Online (Sandbox Code Playgroud)\n这是 Boost.Hana 使用类型包含所需信息的空值进行元编程\xe2\x80\x94 的基础。它并不总是那么漂亮,但它却非常强大。Hana 证明了您也可以使算法适合这种格式,filter一旦您具备了基础,就可以轻松地实现类似的操作。