将模板用于完美转发和Tempate用于任意value_type

时间:2016-03-10 18:10:59

标签: c++ templates stl move-semantics sfinae

  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)
    { /* */ }
    
  3. 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容器,并为完美转发做好准备。我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

只需结合您的条件。我们想要一个带转发参考的函数:

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

您希望基础value_type的{​​{1}}为container。让我们把它放入自己的特性中以便于阅读:

int

现在,不能template <class C> using is_int_container = std::is_same<typename C::value_type, int>; ,因为此时is_int_container<C>可以是对C的引用或引用。但我们可以通过std::decay修复此问题:

const