【发布时间】:2017-09-05 19:03:38
【问题描述】:
我对 C++ 和编译语言还很陌生
目前我有一大段代码,如下所示:
//New note, note36
MemoryInputStream* input36 = new MemoryInputStream(BinaryData::C1hard1_wav, BinaryData::C1hard1_wavSize, false);
auto reader36 = audioFormatManager.createReaderFor(input36);
BigInteger note36;
note36.setRange(36, 1, true);
addSound(new SamplerSound("note36", *reader36, note36, 36, 0.001, 0.01, 26.0));
delete input36;
delete reader36;
//New note, note37
MemoryInputStream* input37 = new MemoryInputStream(BinaryData::Csharp1hard1_wav, BinaryData::Csharp1hard1_wavSize, false);
auto reader37 = audioFormatManager.createReaderFor(input37);
BigInteger note37;
note37.setRange(37, 1, true);
addSound(new SamplerSound("note37", *reader37, note37, 37, 0.001, 0.01, 26.0));
delete input37;
delete reader37;
此代码在此方法中重复 48 次,这不是好的做法。我将如何在 PHP 中实现这一点的示例,解释语言看起来像这样
$noteMap = array(36 => "C1", 37 => "Csharp1");
foreach($noteMap as $midiNumber => $note)
{
$name = $note . "hard1_wav";
$size = $note . "hard1_wavSize";
$input = new MemoryInputStream(BinaryData::$name, BinaryData::$size, false);
$reader = audioFormatManager->createReaderFor($input);
//I know this bit is bad PHP, no bigintegers in PHP but I can't think of a way to replicate it for arguments sake
$note = 0;
$note->setRange($midiNumber, 1, true);
addSound(new SamplerSound("note".$midiNumber, $reader36, $note, $midiNumber, 0.001, 0.01, 26.0));
}
这更易于管理和重用。我所做的更改不需要在整个文件中仔细重复,并且可以快速进行更改。我知道将变量作为函数名传递不是在编译语言中完成的事情,但即使考虑到这一点,也必须有一种方法可以将我的大代码块包装成一个整洁的循环,我只是找不到那里解释的资源给我。
【问题讨论】:
-
你不能在 C++ 中做到这一点。变量名在运行时不可修改。使用
std::vector或其他容器作为阅读器和 MIDI 通道,并在该容器上循环。 -
在 C++ 中,您可以将
std::map用于地图,将基于范围的for用于foreach。而且您不必为input或reader使用低效的动态分配。 -
@user0042:他的代码不需要运行时变量名。
-
您的 C++ 代码和 PHP 应该是相当直接的转换。
$noteMap = array(36 => "C1", 37 => "Csharp1");是做什么的? -
@Richie 如果您想使用字符串作为函数名,那么这就是函数指针(或仿函数/lambda)发挥作用的地方。您创建一个
std::map,其中每个字符串映射到一个特定的函数(这将是长部分),然后您可以使用字符串访问映射并运行相应的函数。你说得对,C++ 没有那个 PHP 特性。
标签: c++ performance loops optimization