c++ - 具有默认值的可变参数模板参数
问题描述
我有一个模板结构,它有一个方法(连同其他参数)接受这些模板参数。
template<class... Types>
struct Observer
{
void subscribe(const std::string& id, Types... args)
{
// store id somehow
data = std::make_tuple(args...);
}
std::tuple<Types...> data;
};
我想让所有模板化参数都是可选的。所以它看起来像这样:
Observer<float, int> observer;
observer.subscribe("id1", 3.14, 4);
observer.subscribe("id2", 0.707); // this doesn't work!
observer.subscribe("id3"); // this doesn't work!
据我所知,没有直截了当的方法吗?但也许有人知道解决方法或技巧。
理想情况下,我想提供我自己的默认值。也许是这样的:
enum class SomeEnum { Val1, Val2 };
Observer<float, SomeEnum, 0.f, SomeEnum::Val1> observer;
observer.subscribe("id1", 3.14);
这是现场示例。
解决方案
在 C++17 中,您可以简单地执行以下操作:
template<class... Types>
struct Observer
{
static constexpr std::tuple<Types...> defaults{42, 24, 99};
template<class... Args>
void subscribe(Args... args)
{
if constexpr (sizeof...(Types) > sizeof...(Args)) {
subscribe(args..., std::get<sizeof...(Args)>(defaults));
} else {
// whatever you need with `args...`
}
}
};
在这里,我只是从中挑选它们Observer::defaults
,但可以随意计算它们。
对于 C++14 及更低版本,您需要模拟if constexpr
. 参见例如Consexpr if alternative for alternatives。
推荐阅读
- c# - 使用 C# 使用 Oracle ORDS RESTful api
- javascript - 工具提示中的 Highcharts 表格样式不起作用
- php - 从 MySql 数据库中的 JSON 列获取数据
- django - 如何在我的 django 模板中每秒更新照片?
- c# - 远程服务器返回错误:(400) 错误请求。仅在其他服务器上出错
- sql - 如果数据库不存在,则截断命令在 SQL SERVER 2016 中给出错误,但在 SQL Server 的较低版本中工作正常..请建议
- excel - 如果使用电话号码,谷歌通过 VBA 搜索没有结果
- python - TensorFlow 到 ONNX 的转换
- java - 如何将 webview 集成到 aosp 中?
- c# - 从 ODataController 返回 CreatedAtRoute 位置