如果没有模板专门化,你能实现同样的事情吗?

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)

chr*_*ris 5

您可以将其设为函数模板以避免专业化并使其更好用:

\n
template<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);\n
Run Code Online (Sandbox Code Playgroud)\n

这是 Boost.Hana 使用类型包含所需信息的空值进行元编程\xe2\x80\x94 的基础。它并不总是那么漂亮,但它却非常强大。Hana 证明了您也可以使算法适合这种格式,filter一旦您具备了基础,就可以轻松地实现类似的操作。

\n