【发布时间】:2017-09-03 12:33:51
【问题描述】:
管理我自己的存档系统,我有以下虚拟功能:
virtual void OutputArchive::save_unsigned_long_int(unsigned long int i);
virtual void OuptutArchive::save_unsigned_long_long_int(unsigned long long int i);
virtual void InputArchive::load_unsigned_long_int(unsigned long int& i);
virtual void InputArchive::load_unsigned_long_long_int(unsigned long long int& i);
然后,由于某种原因,我还必须管理类型std::size_t,这可能因编译器而异。例如,在 64 位 Linux 上使用 gcc,std::size_t 是 unsigned long int,但在 Windows 64 位上使用 intel,std::size_t 是 unsigned long long int。在第一种方法中,我写了这样的东西:
void OutputArchive::save_size_t(std::size_t i)
{
if(boost::is_same<std::size_t,unsigned long int>::value)
this->save_unsigned_long_int((unsigned long int)i);
else if(boost::is_same<std::size_t,unsigned long long int>::value)
this->save_unsigned_long_long_int((unsigned long long int)i);
else { /* error management */ }
}
但是,我对此并不满意:它很丑陋,只能执行一行,类型在编译时是已知的。我想预处理可以做得更好,但我不知道如何开始。欢迎任何帮助。
注意:出于兼容性原因,我不使用 C++11,但我使用 Boost。
【问题讨论】:
-
看起来更像是 SFINAE 的一个用例。
-
save_unsigned_long_int和save_unsigned_long_long_int?这不是绕过 C++ 重载的整个 reason 吗?为什么这不是 one 函数名称允许在参数中使用多种类型? -
然后考虑 paxdiablo 的评论。超载是件好事。而且它完全不排除对它们进行虚拟化。
-
@Caduchon:这是你的错误决定。无论如何,如果你坚持,那就在基类中添加一个非虚拟的重载包装函数,它调用虚拟的。
-
声明一个
save()模板方法。专门为每种数据类型调用适当的虚拟方法。结束。
标签: c++ c-preprocessor preprocessor size-t boost-preprocessor