结合完美转发模板和任意模板value_type

Combine Template for Perfect Forwarding and Tempate for arbitrary value_type

  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
}

我想把这两个合二为一,得到一个接受STL容器的模板函数 value_type int 为完美转发做准备。我怎样才能做到这一点?

结合你的条件。我们想要一个采用转发引用的函数:

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);