字符串化模板数字参数

Stringify a template numeric argument

我有如下一段代码:

template<int maxRegNum> void f(MuliInstr instr);
template<> void f<0>(MuliInstr instr)
{
    if (instr.regA == 0) asm volatile ("mov r4, r0");
}

template<int maxRegNum> void f(MuliInstr instr)
{
    if (instr.regA == maxRegNum) asm volatile ("mov r4, r" ???);
    f<maxRegNum - 1>(instr);
}

那个???是代码中我想对 maxRegNum 进行字符串化的占位符,这是否可以使用 C++11 实现? C 预处理器解决方案也可以:-)

我想实现将其用作代码生成器,避免在需要从 30 个寄存器中做出选择时重复编写此汇编程序移动指令 30 次,例如

感谢您对这个问题的任何提示。

亲切的问候,史蒂夫

编辑: 我想实现以下目标:

当我写 f<31>(instr);在代码的某处,我想要行

if (instr.regA == 31) asm volatile ("mov r4, r31");
if (instr.regA == 30) asm volatile ("mov r4, r30");
if (instr.regA == 29) asm volatile ("mov r4, r29");
...
if (instr.regA == 0) asm volatile ("mov r4, r0");

被放入编译结果

不幸的是,您可能需要提供一个字符串文字 asm,您不能使用模板构建它。

您可以使用 BOOST_PP_REPEAT_FROM_TO 通过宏轻松完成此操作:

#include <boost/preprocessor/repetition/repeat_from_to.hpp>

#define F_DEFINITION(_, maxRegNum, __)                                   \
template<> void f<maxRegNum>(MuliInstr instr) {                          \
    if (instr.regA == maxRegNum) asm volatile ("mov r4, r" #maxRegNum);  \
    f<maxRegNum - 1>(instr);                                             \
}


BOOST_PP_REPEAT_FROM_TO(1, 30, F_DEFINITION, _)

没有提升,你仍然可以通过使用宏来避免一些重复。如果您的 regA 是一个整数成员,这应该是等效的代码:

template<int maxRegNum> void f(MuliInstr instr) {
    static_assert(maxRegNum <= 31, "maxRegNum > 31 not supported");
    switch (instr.regA) {
#define F_CASE(n) \
        case n: \
            if (maxRegNum >= n) asm volatile ( "mov r4, r" #n ); \
            break
#define F_CASE_8(a, b, c, d, e, f, g, h) F_CASE(a); F_CASE(b); F_CASE(c); F_CASE(d); F_CASE(e); F_CASE(f); F_CASE(g); F_CASE(h)
        F_CASE_8(0, 1, 2, 3, 4, 5, 6, 7);
        F_CASE_8(8, 9, 10, 11, 12, 13, 14, 15);
        F_CASE_8(16, 17, 18, 19, 20, 21, 22, 23);
        F_CASE_8(24, 25, 26, 27, 28, 29, 30, 31);
    }
}