Pho*_*rce 5 c++ oop method-chaining
对不起,如果这个问题引起任何混淆,我希望实现这一点,并且不知道正确的方法来处理这样的事情.
对于我的一个项目,我想实现方法链.我想要包含以下功能:
.toVector()
.toArray()
.toBool()
...
Run Code Online (Sandbox Code Playgroud)
我曾想过将这些放在命名空间中,例如:
namespace Misc {
template<typename T, typename Inverse>
vector<T> toVector(Inverse begin, Inverser end) {
// ...
// ..
}
// ...
// ...
}
Run Code Online (Sandbox Code Playgroud)
这是因为可能有多个类,这些类可以使用这些函数,因此,它必须是OO而不是在不同的类中一次又一次地实现每个函数.
假设我有以下类Wav读取wav文件中包含的数据:
class Wav {
public:
Wav();
Wav(string theFileName);
void getWaveData();
protected:
vector<double> data;
};
Run Code Online (Sandbox Code Playgroud)
data 显式存储为类的向量.
在我的主要内容中,我希望能够做到以下几点:
int main()
{
Wav wave("file.wav");
int* data = wave.getWaveData().toArray(); // Method chaining to store as an array
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是否可能,如果是这样的话,如果不在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;
}
Run Code Online (Sandbox Code Playgroud)
如果我有另一个功能:
void process()
{
}
Run Code Online (Sandbox Code Playgroud)
什么会因此我需要把里面params的process,以接受以下几点:
int* data = process(toArray<int>(
std::begin(vals),
std::end(vals)
);
这是让我最困惑的事情吗?
小智 2
关于您的新功能:
为了能够调用下面的process方法
int* data = process(toArray<int>( vals.begin(), vals.end()) );
Run Code Online (Sandbox Code Playgroud)
process 方法的参数应与 toArray 方法的返回类型匹配。也许您也可以将处理方法模板化,如下所示。
template<typename T>
T* process(T* t)
{
//more code here
return t;
}
Run Code Online (Sandbox Code Playgroud)
如上所述添加 process 方法后,对 process 的调用将进行编译,但您必须使 process 方法的实现足够通用,以处理来自其他方法(如 toArray)的不同返回类型。