Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
预处理器样式与C++;模板? < P>假设为了实现这个问题,我在BC++类中调用了OPESH等方法。在这样做的时候,我注意到所有12个左右的函数基本上是相同的,我不希望复制太多的源代码_C++_Templates - Fatal编程技术网

预处理器样式与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);