求指导答,关于C++模板的几个问题

C++语言 码拜 9年前 (2016-04-13) 767次浏览
1. 定义了一个const枚举数组作为全局数组,如下:
头文件:
namespace test{
static const EnumTest c_array[];
static ClassA s_globalArray[];
}
实现文件:
namespace test{
const EnumTest c_array={ENUM_OPTION1,ENUM_OPTION2,ENUM_OPTION3, (大约有40个常量)…, ENUM_OPTION40 };
ClassA s_globalArray[ sizeof(c_array) / sizeof(EnumTest) ] = {0};
}
//编译错误,不完整的类型
目前解决方法是一个个数枚举常量的数量,然后定义一个常量为c_array_size,但万一以后增加或减少,岂不是又要重数?有没有模板或宏 让计算机在编译期本人确定c_array_size?
2. 本人尝试写一个string_buffer, 其他都好说
template<typename T, size_t initialSize, bool Full=true> class stringBufferT{

size_t get_size(){
if(Full){
return initialSize*blocks + m_index;
}else{
size_t total;
for(size_t i=0;i<m_block.size();i++){
total += m_block[i].size;
}
return total + m_index;
}
}
代码没有问题,但本人想把Full变成宏,相似C里的
ifdef Full
#else
#endif
不知道C++的模板能否可以在编译期确定,而不用在运行期判断?
很期待这两个问题有解决方案,希望大家可以提供建议。
解决方案

40

1.
enum xxx {
ENUM_OPTION1,
ENUM_OPTION1,
ENUM_OPTION1,

ENUM_OPTION40,
c_array_size
};
2.
不能。
但是可以偏特化。

//// empty case
template<typename T, size_t initialSize, bool Full=true> class stringBufferT{
...
size_t get_size(){
// if(Full){
//    return initialSize*blocks + m_index;
//}else{
  size_t total;
   for(size_t i=0;i<m_block.size();i++){
       total += m_block[i].size;
   }
  return total + m_index;
//}
};
///// Full case 
template<typename T, size_t initialSize> class stringBufferT<T, initialSize, true>{
...
size_t get_size(){
// if(Full){
    return initialSize*blocks + m_index;
//}else{
//  size_t total;
//   for(size_t i=0;i<m_block.size();i++){
//       total += m_block[i].size;
//   }
//  return total + m_index;
//}
};

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求指导答,关于C++模板的几个问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)