这个周末我在柏林会议 CPP 参加了 Romeo Vittorio 的演讲。在他的库ECST中,他在Boost.Hana的顶部实现了一个 option_map,以便“构建”将用于创建实际类型的设置:
constexpr auto s = // .
ecst::settings::make() // .
.allow_inner_parallelism() // .
.fixed_entity_limit(entity_limit) // .
.component_signatures(make_csl()) // .
.system_signatures(make_ssl()) // .
.scheduler(cs::scheduler<ss::s_atomic_counter>);
...其余的代码在这里
我发现 API 非常好,因为我们创建了一个带有函数调用的类型:我们实际上将元编程作为“普通”编程进行,我喜欢这一点。此外,对于复杂的模板类型,使用这种方法(在库端)进行开发要容易得多:同样,只有constexpr方法和函数,根本没有模板。
现在,我的问题是关于这个 API 的使用。这种方法的问题在于,隐藏在auto后面的类型实际上非常复杂,而且不是“API 用户友好”,因为它是由 constexpr 函数生成的,我认为这很好:用户不需要知道确切的类型,他只是想用它,对吧?但是他将如何使用这个类作为类的属性,因为auto不能用作非静态属性?
static constexpr auto ctx = ecst::...;
using context_t = decltype(ctx);
context_t _context;
或者
decltype(ecst::...) _context;
在我看来,这不是优雅的解决方案。强制使用decltype对我来说似乎并不好。
另一种解决方案是简单地将 this auto类型作为模板参数传递给一个类——这就是 ECST 在示例中所做的——但同样,它限制了很多用户,因为他必须模板化他的整个代码才能使用图书馆。
你怎么看?这里有优雅的解决方案吗?