c++ - 完美地将 STL 容器转发到模板类
问题描述
尝试使用完美转发将序列容器传递给模板化的类。例如:
template<template<typename T, typename Alloc> class TContainer, class TObject>
class A {
public:
using ContType = TContainer<TObject, std::allocator<TObject>>;
//This works for R-value references only
explicit A(ContType&& container) : internalContainer(std::forward<ContType>(container)) {};
//This does not work - how might I make it work?
template <typename C>
explicit A(C&& input) : internalContainer(std::forward<C>(input)) {}
private:
ContType internalContainer;
};
我有一个问题,我正在尝试定义一个完美的转发构造函数,并且对于如何做到这一点有点迷茫。
我在本网站的其他地方读到您不能将显式类型参数传递给构造函数。这样做是提供 R 值和 L 值构造函数的唯一方法吗?
解决方案
更简单的是使用几个重载:
template<template<typename T, typename Alloc> class TContainer, class TObject>
class A {
public:
using ContType = TContainer<TObject, std::allocator<TObject>>;
// for R-value
explicit A(ContType&& container) : internalContainer(std::move(container)) {}
// for L-value
explicit A(const ContType& container) : internalContainer(container) {}
private:
ContType internalContainer;
};
否则,您可以使用转发参考并使用 SFINAE 进行保护
template<template<typename T, typename Alloc> class TContainer, class TObject>
class A {
public:
using ContType = TContainer<TObject, std::allocator<TObject>>;
template <typename T,
std::enable_if_t<
!std::is_same<A, std::decay_t<T>::value // Protect copy constructor
&& std::is_constructible<ContType, T&&>::value>, int> = 0>
explicit A(T&& container) : internalContainer(std::forward<T>(container)) {}
private:
ContType internalContainer;
};
推荐阅读
- django - 从 django 选择字段的数据存储中检索列表
- php - 无法将文件名存储在数据库中
- c - 如何在宏中使用##?
- python - 在python中的进程之间传输数据
- ios - 展开 - 可选值时意外发现 nil
- c++ - C++ | 日志 | 如何使用不同的格式化程序进行 sinc?
- node.js - 猫鼬:MongoError 没有地理搜索索引
- java - bin打包java代码
- azure-cosmosdb - UniqueId 或 UniqueId 的子字符串作为 Cosmos DB 中的分区键?
- javascript - java中使用MongoClient的mongo函数和forEach复杂查询