结合模板进行完美转发和诱惑以进行任意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
}
我想将这两者合二为一,以获得一个模板函数,该函数接受带有value_type
int
的 STL 容器,并为它们做好完美转发的准备。我怎样才能做到这一点?
只需结合您的条件即可。我们想要一个接受转发引用的函数:
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);
相关文章:
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 从函数返回任意简单类型的数据
- 为什么我会" void value not ignored as it ought to be"?
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 方法错误"not all control paths return a value"和方法不返回值
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 将正态随机变量与任意 RHO(corrcoef) 相关联
- 在C++中生成任意嵌套的向量
- 如何在 c++ 中理解这样的代码 [request->headers().Method()->value().getStringView())]
- std::<key-value>不同类型的对向量
- c++ visual studio 64bit | save registers value
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?
- 如何解决类成员函数中的"return a value"错误?
- bsoncxx: document::view vs document::value
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- .value( "key" , default) 不适用于空的 json 对象吗?