结合完美转发模板和任意模板value_type
Combine Template for Perfect Forwarding and Tempate for arbitrary value_type
我有这个函数模板 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);
并且您希望底层 container
的 value_type
是 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);
我有这个函数模板
的 STL 容器foo
,它采用任何包含int
: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);
并且您希望底层 container
的 value_type
是 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);