有一个A
带有模板参数的模板类T
。f
如果T
是整数类型,我希望这个类有一个方法。该类A
还有很多其他方法,所以我不想专门化整体A
。我知道这个问题可以使用继承来解决,但我的问题是关于概念和要求。
这段代码
template <typename T>
struct A {
void f();
};
template <>
void A<int>::f() {}
按我的预期工作。它仅对类型进行f
实现int
。如果我尝试调用A<std::string>{}.f();
它会按预期生成链接器错误。但如果我写
template <typename T>
struct A {
void f();
};
template <std::integral T>
void A<T>::f() {}
任何一个
template <typename T> requires std::is_integral_v<T>
void A<T>::f() {}
该方法f
是为所有类型生成的,因此调用A<std::string>{}.f();
不会给出任何错误。
这也有效
template <typename T>
struct A {
void f() {}
};
template <>
void A<std::string>::f() = delete;
但是这个
template <typename T>
struct A {
void f() {}
};
template <std::integral T>
struct A<T>::f() = delete;
给出编译错误,即重新定义f
.
PS似乎根本不允许这样的构造,而g++
只是忽略了方法定义中的概念f
。