c++ 没有模板特殊化也能达到同样的效果吗?

hkmswyz6  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(107)

比方说,我需要创建一个类型,该类型接受新类型的方式与容器的工作方式相同。
如果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';
}
pod7payv

pod7payv1#

你可以把它做成一个函数模板来避免特殊化,并且让它更好用途:

template<typename T, typename... Args>
auto push_back(type_list<Args...>) {
    return type_list<Args..., T>{};
}

...

auto y = push_back<float>(x);

这就是Boost.Hana为元编程带来的基础--使用空值,其类型包含所需的信息。它并不总是这么漂亮,但它令人惊讶地强大。Hana证明了你也可以让算法适合这种格式,一旦你有了基础,就可以让像filter这样的操作以类似的轻松程度实现。

相关问题