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++的模板能否可以在编译期确定,而不用在运行期判断?
很期待这两个问题有解决方案,希望大家可以提供建议。
头文件:
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.
不能。
但是可以偏特化。
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; //} };