我有这个函数模板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)
{ /* */ }
我有这个函数模板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容器,并为完美转发做好准备。我怎么能做到这一点?
答案 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