结合模板进行完美转发和诱惑以进行任意value_type

Combine Template for Perfect Forwarding and Tempate for arbitrary value_type

本文关键字:任意 value type 诱惑 转发 完美 结合      更新时间:2023-10-16
  1. 我有这个函数模板foo它接受任何包含int的 STL 容器:

    template <typename ContainerType, std::enable_if_t<std::is_same<typename ContainerType::value_type, int>::value, int> = 0>
    void foo(ContainerType const& list)
    { /* */ }
    
  2. 我有这个函数模板bar它采用std::vector<int>并将其转换为完美的转发(或引用转发,无论您如何称呼它):

    template <typename ContainerType, std::enable_if_t<std::is_same<std::decay_t<ContainerType>, std::vector<int>>::value, int> = 0>
    void bar(ContainerType&& list)
    { /* */ }
    

int main(void)
{
    std::initializer_list<int> list{1, 2, 3};
    std::vector<int> vec{1, 2, 3};
    foo(list);  // OK
    foo(vec);  // OK
    foo(std::vector<int>{4, 5, 6});  // OK, but copy-semantics
    bar(vec);  // OK
    bar(std::vector<int>{4,5,6});  // OK
    bar(list);  // ERROR
}

我想将这两者合二为一,以获得一个模板函数,该函数接受带有value_type int的 STL 容器,并为它们做好完美转发的准备。我怎样才能做到这一点?

只需结合您的条件即可。我们想要一个接受转发引用的函数:

template <class C, class = std::enable_if_t<???> >
void quux(C&& container);

并且您希望基础containervalue_typeint。让我们把它扔到它自己的特征中以提高可读性:

template <class C>
using is_int_container = std::is_same<typename C::value_type, int>;

现在,不能只做is_int_container<C>因为C目前可以参考或参考const。但是我们可以std::decay通过以下方式解决此问题:

template <class C, class = std::enable_if_t<is_int_container<std::decay_t<C>>::value >>
void quux(C&& container);