我天真地认为,在模板类内部,我可以引用不存在的对象,因为它们在实例化之前不是必需的。但这不起作用(编译器抱怨未声明的名称):
template<typename H>
class HandlerInfoClass
{
std::string_view getName()
{
return NAME;
}
};
在不使用预处理器或添加新模板参数(其中一些参数可能具有在此上下文中不允许的类型)的情况下,有没有方法克服这一点?
不可能引用不存在的对象。模板函数的一个关键属性是,对于给定的参数,输出总是相同的。因此,在代码中实例化模板的位置并不重要,它将始终为相同的参数调用相同的函数。
您正在构建的东西看起来像是“处理程序”的trait类。正确的编写方法是为每个不同的类型专门化类,如下所示:
template<typename H>
class HandlerInfoClass;
template<>
class HandlerInfoClass<HandlerType>
{
static std::string_view getName()
{
return "HandlerType";
}
};
如果您返回的字符串在运行时发生了变化,那么您不应该构建traits类,而是向对象本身添加一个
多亏了通用汽车。我找到了一个很好的变通方法:将“name”作为静态变量放入type中,即模板参数:
template<typename H>
class HandlerInfoClass
{
std::string_view getName()
{
return H::NAME;
}
};