存储模板参数包作为非类模板的属性
Store template parameter pack as a attribute of a non class template
是否可以存储传递给非类模板的构造函数的variadic模板参数/参数pack作为该类的属性,而无需将该阶级变成一个类模板?
我目前正在开发一个薄包装类别(我在这里仅创建了一个最小的示例以最大程度地减少复杂性),该签名:
class Wrapper final {
public:
template <typename Function, typename... Args>
auto start(Function&& function, Args&&... args) -> void;
};
参数包将传递给成员函数模板start<Function, ... Args>
,目前无需"存储" function
或args
。完美的转发用于该功能内的进一步处理。
现在,我想实现的是一个签名,如下所示(介绍接口类):
class WrapperInterface {
public:
virtual ~WrapperInterface() = default;
virtual auto start() -> void = 0;
};
// TODO(2019-03-17 by wolters) The following is non-working pseudo-code.
class Wrapper final : public WrapperInterface {
public:
template <typename Function, typename... Args>
explicit Wrapper(Function&& function, Args&&... args)
: function_{function}, args_{args} {
// NOOP
}
auto start() -> void {
// TODO(2019-03-17 by wolters) Invoke `function_` with `args_`.
function_(args);
}
private:
std::function<???> function_;
std::tuple<???> args_;
};
然后Wrapper
可以用如下:
class WrapperClient final {
public:
WrapperClient() : wrapper_{[this](){
// std::cout << "startedn";
}} {
// NOOP
}
private:
Wrapper wrapper_;
};
尽管在上面的示例中不需要接口类,但通常需要将实例存储在 std::vector<std::unique_ptr<WrapperInterface>>
中。
我已经阅读并尝试了如何存储variadic模板参数?,但是这种方法需要将 Wrapper
变成类模板。
我认为需要与QThread *QThread::create(Function &&f, Args &&... args)
实现相似的东西。可悲的是,该代码对我来说太好了。
您可以指导我走向正确的方向吗?是否可以使用私人实施类模板?
您要做的是称为type-ersusure,这是一种非常有趣的技术(例如,这里是一个无耻的自我启示),但是在std::function
中已经为您完成了您要做的就是使用std::function<void()>
并使用std::bind
或Lambda捕获来存储参数:
template <typename Function, typename... Args>
std::function<void()> wrap(Function&& function, Args&&... args)
{
return [=] { function(args); };
// or return std::bind(std::forward<Function>(function), std::forward<Args>(args)...);
}
相关文章:
- 如何反转整数参数包
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- cmake如何在fedora工作站中找到boost静态库包
- 如何将enable-if与模板参数和参数包一起使用
- C++概念:如何使用'concept'检查模板化结构的属性?
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 通过指向指针数组的指针访问子类的属性
- MSVC是否支持C++11样式的属性而不是__declspec
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 为什么这个音频包络不能通过开关的情况?
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 类的C++属性似乎已重新初始化
- 在C++游戏中与库存系统作斗争
- Qt Quick-如何仅从c++代码与qml属性交互
- 模板元编程:如何将参数包组合成新的参数包
- 在C++中使用参数包作为类属性是否可能和/或良好的实践
- 如何使用属性包添加边缘以提升::adjacency_matrix
- 存储模板参数包作为非类模板的属性
- 模板参数包属性
- 使用类属性作为数组绑定