在模板中,我有一些仅对某些模板类型有效的函数。海湾合作委员会似乎对此感到满意,但我不确定它是否有效。与典型的SFINAE不同,函数本身不是模板。
template<typename T>
struct generic {
T item;
void get_limited() {
item.limited();
}
};
如果我不调用get_limited
,是否可以使用未实现limited
的类型实例化此类?
如果不是,我该如何解决?我有一个通用容器类,其中某些功能基于它正在存储的分配而启用(因此不直接在上面的类型上,但仍然是模板参数)。
答案 0 :(得分:5)
模板函数是按需实例化的,因此如果没有使用该函数,它就不必是正确的,至少对于某些可能的实例化是这样。该标准确实声明如果模板对任何实例化类型无效,则程序格式不正确(尽管编译器不需要诊断它),即使它从未实例化过。
此功能在不同部分的标准库中使用,其中单个函数的要求可能比模板放置在实例化类型上的一般要求更严格。例如,在std::map
的情况下,通常,值类型不需要是默认可构造的,但是如果要使用operator[]
则需要它,因为该运算符可能需要如果密钥不存在,则创建一个空元素。