使用模板参数添加数据

时间:2018-02-17 04:35:02

标签: c++ templates

我有一个设计问题。我对这个问题使用了一些解决方案,但我并不喜欢它,我不确定我认为的其他选择是否是一件好事。还欢迎其他想法。

考虑

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

还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

我想说你遇到的问题可以通过多态来解决。如果由于某种原因无法实现,则需要在编译时解决此问题。你可以去CRTP

答案 1 :(得分:1)

如果您可以定义一个公共接口,可能包括Mminus的无操作(例如您的InitilalizeData),那么您可以在Mminus和{{1}中定义这些方法{和Mplus中的任何调用将使用继承的版本。如果方法需要访问常见的MyClass功能,则使用CRTP反转继承可能更为自然:

MyClass