使用scopedptr解压缩varadic模板
unpack variadic template with scoped_ptr
我使用的是可变模板,我想找到一种很好的方法来解压我的参数
template <typename kernel_type, typename ...kernel_types>
class MetaKernel : public MyKernel<kernel_type, kernel_types...> {
public:
MetaKernel (
unsigned int m,
unsigned int n,
const kernel_type& kernel_,
const kernel_types&... kernels_
) :
MyKernel<kernel_type, kernel_types...>(m, n)
{
Ks.set_max_size(sizeof...(kernel_types));
Ks.set_size(sizeof...(kernel_types));
// for each kernels_, add a MyObsKernel to Ks
// Ks[sizeof...(kernel_types)].reset((new MyObsKernel<kernel_type, kernel_types...>(kernels_, prototypes_, m, n))...);
}
private:
array < scoped_ptr < MyObsKernel<kernel_type, kernel_types...> > > Ks;
}
从文档中(http://en.cppreference.com/w/cpp/language/parameter_pack),我看到了如何像这样打开包装:
int dummy[sizeof...(Ts)] = { (std::cout << args, 0)... };
但当我处理scope_ptr表时,我需要用"重置"来初始化它。所以我的解决方案不起作用。如何使用scope_ptr解压缩参数?
谢谢你的帮助,Jerome
您可以使用初始化器列表初始化std::array
。以下内容可能会有所帮助:https://ideone.com/PTwatb
MetaKernel (unsigned int m, unsigned int n, const kernel_type& kernel_, const kernel_types&... kernels_) :
MyKernel<kernel_type, kernel_types...>(m, n),
Ks({scoped_ptr<MyObsKernel<kernel_type, kernel_types...> >(new MyObsKernel<kernel_type, kernel_types...>(kernels_, kernel_, m, n))...})
{
}
正如我在评论中所说,您的问题是不完整的。我知道Ks
是大小为N = sizeof...(kernel_types)
的std::array
,并且您希望对每个元素调用reset()
。如果是这样,这里有一个解决方案:
struct _do { template<typename... A> _do(A&&...) { } };
template <typename kernel_type, typename ...kernel_types>
class MetaKernel : public MyKernel<kernel_type, kernel_types...>
{
using Base = MyKernel<kernel_type, kernel_types...>;
using Obs = MyObsKernel<kernel_type, kernel_types...>;
static constexpr size_t N = sizeof...(kernel_types);
public:
MetaKernel (
unsigned int m,
unsigned int n,
const kernel_type& kernel_,
const kernel_types&... kernels_
) : Base(m, n)
{
reset(std::make_integer_sequence<size_t, N>(), m, n, kernels_...);
}
private:
template<size_t... I>
void reset (
std::integer_sequence<size_t, I...>,
unsigned int m,
unsigned int n,
const kernel_types&... kernels_
)
{
_do{Ks[I].reset(new Obs(kernels_, /*prototypes_,*/ m, n))...};
}
array <scoped_ptr <Obs>, N> Ks;
};
我正在使用辅助对象_do
和C++14的特征std::integer_sequence
、std::make_index_sequence
。如果这不可用,您可以在此处查看Range
,其中还解释了_do
。
您需要除构造函数之外的第二个函数来推导索引包I...
,并使用它与参数kernels_...
对齐,以便在Ks
的一个元素上的reset()
的一个调用中使用每个参数。
如果您有更多这样的拆包操作,最好在整个类中都有I...
可用,并直接使用它。然后,您只需要第二个MetaKernelImpl
类,而不是为每个函数添加第二个版本。这个类将有一个额外的模板参数,专门用于某些推导包size_t... I
的std::integer_sequence<size_t, I...>
。再次,看看这里的Caller
,看看如何做到这一点。
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 为什么通过通用引用运算符 (&&) 将变量的引用传递给 Varadic 模板函数失败?
- varadic模板中的函数参数数量与类中的相同
- gcc可以编译varadic模板,而clang不能
- std::函数到varadic成员函数,然后绑定varadic模板参数
- 使用scopedptr解压缩varadic模板