【问题标题】:Method chaining from namespace来自命名空间的方法链
【发布时间】:2013-08-08 20:24:40
【问题描述】:

对不起,如果这个问题引起任何混淆,我正在寻求实现这一点,但不知道处理这种事情的正确方法。

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

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

我考虑过将它们放在命名空间中,例如:

namespace Misc {
   template<typename T, typename Inverse>

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

   // ...
   // ...
}

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

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

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

data 在类内部显式存储为向量。

在我的主要工作中,我希望能够做到以下几点:

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()
{

}

因此,为了接受以下内容,我需要在 paramsprocess 中放入什么:

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

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

【问题讨论】:

  • 为什么必须是方法链?如果您的目标是(可能是嵌套的)函数调用,那将是微不足道的。
  • @delnan 你能举例说明你的意思吗?
  • toBool(toArray(wave.getWaveData())) 而不是wave.getWaveData().toArray().toBool()
  • 为了链接所有不同的类需要继承。我认为最好不要这样做,因为据我所知,这不是好的 OO 设计。这也会导致依赖。
  • 由于每个类的每个函数的实际工作都需要不同,我真的不明白你希望通过将它们外部化来实现什么。让getWaveData 和类似返回一个包装器对象,其中定义了toArray 等。这会很容易。不过,您需要注意范围;如果你不小心的话,看起来你会得到一些段错误/无效的内存读取。

标签: c++ oop method-chaining


【解决方案1】:

关于你的新功能:

为了能够调用下面的流程方法

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

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

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

如上添加 process 方法后,对 process 的调用将编译,但您必须使 process 方法的实现足够通用,以处理来自其他方法(如 toArray)的不同返回类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多