宏重复几乎相同的代码

Mir*_*pas 5 c++ c-preprocessor

我必须编写依赖于编译时常量参数的相同代码,例如:

map["text 0"] = vec[0];
map["text 1"] = vec[1];
...
map["text n"] = vec[n];
Run Code Online (Sandbox Code Playgroud)

问题是我不知道n何时编写代码,我将其作为模板参数接收.显而易见的解决方案是使用一个循环并"text k"在循环内部生成并使用vec[k],但是当它应该在编译时完成时,这会产生运行时开销.另一种解决方案是将函数专门化为不同的N值,但是这样我将不得不多次手动编写相同的代码,并且没有理由将其作为模板.

我知道有一些智能宏可以重复类似的事情N次(比如BOOST_PP_REPEAT宏系列),但我找不到一个针对我特定问题的解决方案.

你对这个问题有什么解决方案吗?

And*_*owl 4

除非您有非常非常严格的性能限制,否则没有理由担心运行时开销。无论如何,插入都会在运行时执行,并且插入时间肯定会主导更改字符串中的字符所需的时间。

此外,宏很难调试和维护:如果可能的话避免使用它们。在这里,我建议展开一个简单的循环:

std::string s = "text 0";
std::map<std::string, int> m;
for (int i = 0; i < N; i++)
{
    m[s] = vec[i];
    s[5] = '1' + i; // This is going to be the run-time overhead...
}
Run Code Online (Sandbox Code Playgroud)

如果您的数字增长高于9,在 C++11 中您可以使用该to_string()函数将整数转换为字符串:

std::string const s = "text ";
std::map<std::string, int> m;
for (int i = 0; i < N; i++)
{
    m[s + std::to_string(i)] = vec[i];
}
Run Code Online (Sandbox Code Playgroud)

如果性能被证明是一个问题,那么您可以尝试基于宏的更核心的方法。但是,如果您的测量结果不会表明有很大的开销,那么最好选择简单明了的方式,并展开一个简单的循环。