比方说,我需要创建一个类型,该类型接受新类型的方式与容器的工作方式相同。
如果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';
}
1条答案
按热度按时间pod7payv1#
你可以把它做成一个函数模板来避免特殊化,并且让它更好用途:
这就是Boost.Hana为元编程带来的基础--使用空值,其类型包含所需的信息。它并不总是这么漂亮,但它令人惊讶地强大。Hana证明了你也可以让算法适合这种格式,一旦你有了基础,就可以让像
filter
这样的操作以类似的轻松程度实现。