我有一个设计问题。我对这个问题使用了一些解决方案,但我并不喜欢它,我不确定我认为的其他选择是否是一件好事。还欢迎其他想法。
考虑
test.find({$or : [ array ] }, {"email": 1, "_id": 0}).toArray(function (err,data){
if (err) throw err;
console.log(data);
});
struct Mminus
{ /*empty*/ };
struct Mplus
{ /*mainly data members*/ };
template <typename More> class MyClass : More
{
// etc.
};
有一个实例,但在具有几乎相似功能的不同项目中使用。额外数据的工作量很大,因此在编译时应删除未使用的数据。
现在MyClass
执行与MyClass<Mplus>
相同的操作+ + MyClass<Mminus>
数据初始化的额外步骤以及在公开功能中对此数据的一些使用。
Mplus
中的数据初始化需要Mplus
已知的内容,这些内容不适合作为参数发送,以将该初始化移动为MyClass<Mplus>
的一部分。
我使用的解决方案是
<Mplus>
然后将其称为
template<typename M>
typename std::enable_if<!std::is_same<M, Mplus>::value>::type
InitilalizeData()
{/*etc*/}
template<typename M>
typename std::enable_if<!std::is_same<M, Mminus>::value>::type
InitilalizeData()
{/*do nothing*/}
我真的不喜欢这个解决方案,因为在使用这些额外数据的代码片段中最终需要类似的InitilalizeData<More>();
模板函数;
是否有类似
的有效解决方案enable_if
还有其他想法吗?
答案 0 :(得分:1)
我想说你遇到的问题可以通过多态来解决。如果由于某种原因无法实现,则需要在编译时解决此问题。你可以去CRTP
答案 1 :(得分:1)
如果您可以定义一个公共接口,可能包括Mminus
的无操作(例如您的InitilalizeData
),那么您可以在Mminus
和{{1}中定义这些方法{和Mplus
中的任何调用将使用继承的版本。如果方法需要访问常见的MyClass
功能,则使用CRTP反转继承可能更为自然:
MyClass