来自命名空间的方法链接

Method chaining from namespace

本文关键字:方法 链接 命名空间      更新时间:2023-10-16

很抱歉,如果这个问题引起了任何困惑,我正在寻求实现它,但不知道如何正确处理这样的事情。

对于我的一个项目,我想实现方法链接。我想合并以下功能:

.toVector()
.toArray()
.toBool()
...

我曾考虑过将这些放在一个命名空间中,例如:

namespace Misc {
   template<typename T, typename Inverse>
   vector<T> toVector(Inverse begin, Inverser end) {
      // ...
      // ..
   }
   // ...
   // ...
}

这是因为可能有多个类,这些类可能能够使用这些函数,因此,它必须是OO,而不是在不同的类中一次又一次地实现每个函数。

假设我有以下类Wav,它读取wav文件中包含的数据:

class Wav {
   public:
     Wav();
     Wav(string theFileName);
     void getWaveData();
  protected:
     vector<double> data;
};

CCD_ 2被显式地存储为类内部的向量。

总的来说,我希望能够做到以下几点:

int main()
{
    Wav wave("file.wav");
    int* data = wave.getWaveData().toArray(); // Method chaining to store as an array
}

我不知道这是否可能,如果可能的话,如果不在每个类中一遍又一遍地实现所有Misc函数,我将如何实现这一点。有没有一种方法可以在命名空间和类之间进行通信,而不必一遍又一遍地包含所有函数?

我希望有人能给我一个建议,任何问题我都会尽力回答。

编辑:

我已经写了以下功能:

template<typename T, typename Inverse>
T* toArray(Inverse begin, Inverse end)
{
size_t size = distance(begin, end);
auto pos = 0;
T* tmp = new T[size];
for(auto i = begin; i != end; i++)
{
    tmp[pos] = *i;
    pos++;
}
return tmp;
}

如果我有另一个功能:

void process()
{
}

因此,我需要在processparams中放入什么才能接受以下内容:

int* data = process(toArray<int>( std::begin(vals), std::end(vals) );

这是最让我困惑的事情吗?

关于您的新功能:

为了能够调用下面的处理方法

int* data = process(toArray<int>( vals.begin(), vals.end()) );

process方法的参数应该与toArray方法的返回类型匹配。也许您也可以将流程方法模板化,如下所示。

template<typename T>
T* process(T* t)
{
   //more code here 
   return t;
}

如上所述添加流程方法后,对流程的调用将进行编译,但您必须使流程方法的实现足够通用,以处理与toArray等其他方法不同的返回类型。