我有这个函数模板
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
}
我想把这两个合二为一,得到一个接受STL容器的模板函数value_type
int
并为完美转发做好准备。我怎样才能做到这一点?
最佳答案
就结合你的条件吧。我们想要一个接受转发引用的函数:
template <class C, class = std::enable_if_t<???> >
void quux(C&& container);
而你想要 value_type
标的container
是int
.让我们将其放入其自身的可读性特征中:
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);
关于c++ - 结合完美转发模板和任意值类型模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35924117/