在我的模板中,我需要根据 typename 是否为基本类型来使用不同的代码部分。
编译此代码会在 MSVC 中给出 C4067(预处理器指令后的意外标记 - 需要换行符):
template <typename T>
void MyClass<T>::foo()
{
// ... some code here
#if std::is_fundamental<T>::value
if(m_buf[j] < m_buf[idx_min])
idx_min = j;
#else
const ASSortable& curr = dynamic_cast<ASSortable&>(m_buf[j]);
const ASSortable& curr_min = dynamic_cast<ASSortable&>(m_buf[idx_min]);
// error checking removed for simplicity
if(curr.before(curr_min))
idx_min = j;
}
#endif
该模板适用于原始数据类型和我自己的(从 ASSortable 派生的)数据类型,并且从模板实例化代码中引发错误:
template class MyClass<char>;
尝试将预编译器表达式修改为此也不起作用:
#if std::is_fundamental<T>::value == true
并产生相同的确切警告。
任何想法如何使此代码无警告?
编辑想到的另一件事是将其转换为运行时检查并使用“常量 if 表达式”警告...真的没有办法在没有专业化和额外膨胀的单个函数中优雅地做到这一点?
编辑#2所以我解决这个问题的方法(这很明显,但不知何故让我逃脱了......)是定义一个bool ASSortable::operator<(const ASSortable& _o) const {return this->before(_o);};
可以完成工作并使代码干净的方法(再次)。
我的代码中不再有if
s 或#ifdef
s 或任何类似的混乱!
不敢相信我什至问了这个问题,因为它有一个如此明显和简单的答案:(