预处理器样式与C++;模板? < P>假设为了实现这个问题,我在BC++类中调用了OPESH等方法。在这样做的时候,我注意到所有12个左右的函数基本上是相同的,我不希望复制太多的源代码
我可以选择使用预处理器执行以下操作预处理器样式与C++;模板? < P>假设为了实现这个问题,我在BC++类中调用了OPESH等方法。在这样做的时候,我注意到所有12个左右的函数基本上是相同的,我不希望复制太多的源代码,c++,templates,C++,Templates,我可以选择使用预处理器执行以下操作 typedef uint16_t U16; typedef uint32_t U32; typedef uint64_t U64; #define BETOH_XX(nbits) \ U##nbits OpSys::betoh##nbits, U##nbits val) \ { \ if (CPU_IS_BIG
typedef uint16_t U16;
typedef uint32_t U32;
typedef uint64_t U64;
#define BETOH_XX(nbits) \
U##nbits OpSys::betoh##nbits, U##nbits val) \
{ \
if (CPU_IS_BIG_ENDIAN) \
return val; \
\
return bswap##nbits(val); \
}
BETOH_XX(16)
BETOH_XX(32)
BETOH_XX(64)
。。。但我想知道是否有某种方法可以用模板完成同样的事情,我的调用看起来像这样
U16 hval = betoh<16>(beval);
U16 hval=betoh(beval);
我还看到了一些其他的问题,但似乎并没有任何问题需要将模板化值连接到相邻的文本中
这是可能的吗?我不认为连接任意模板值以形成新的标识符是可能的(或者应该是,这会破坏其他安全模板提供的功能)。但是,(正如评论中提到的)可以为您的特定示例归档类似的内容 获取所需的语法
U16 hval = betoh<16>(beval);
我不确定这些措施是否切实可行和/或有效;-) 您可以制作一个模板化的
uint\u位
或具有专门化的东西,然后只需模板化betoh
和bswap
“您可以制作一个模板化的uint\u位
”,这不是一个模板类型定义,也就是别名声明吗?我认为这些不允许专门化,因此我不确定如何定义uint\u位
,以便uint\u位
映射到uint16\u位
。还是我误解了你?我的模板fu很弱…据我回忆,你是对的,但它可能只是一个普通的结构
,带有类型
成员和一个简单的包装器。为什么不使用重载函数呢?因为那样的话,我还需要编写12个,正如我在问题中提到的那样。另外,这个问题是关于扩展我对模板的知识,而不是其他任何东西。(尽管它对我来说也有实际应用。)不错。我感觉这就是“克里斯”在对我上述问题的评论中所指的。我睡过觉后会试试这个,然后汇报/接受。我很感谢您在这里所做的努力,我相信我会从中学到很多。哈,我从您的第二次实施中看到,我不必要地使事情复杂化了。:)我确实注意到,这里的一个权衡似乎是我失去了使用bswap快速实现的能力。(我想,除非我提供bswap的专业化。)
template <size_t bitsize> struct uint_bits;
template<> struct uint_bits<8>{typedef uint8_t type;};
template<> struct uint_bits<16>{typedef uint16_t type;};
template<> struct uint_bits<32>{typedef uint32_t type;};
template <size_t bitsize>
typename uint_bits<bitsize>::type bswap(typename uint_bits<bitsize>::type value)
{
typename uint_bits<bitsize>::type ret_val=0;
for(size_t b=0;b<sizeof(value);++b)
{
ret_val<<=8;
ret_val|=(value&0xff);
value>>=8;
}
return ret_val;
}
template <size_t bitsize>
typename uint_bits<bitsize>::type betoh(typename uint_bits<bitsize>::type value)
{
if(CPU_IS_BIG_ENDIAN)
return value;
return bswap<bitsize>(value);
}
template <typename T>
T bswap(T value)
{
T ret_val=0;
for(size_t b=0;b<sizeof(value);++b)
{
ret_val<<=8;
ret_val|=(value&0xff);
value>>=8;
}
return ret_val;
}
template <typename T>
T betoh(T value)
{
if(CPU_IS_BIG_ENDIAN)
return value;
return bswap(value);
}
U16 hval = betoh(beval);