我试图添加一个方法和类的泛型类型一致的专门化,但是我还不能准确地弄清楚如何指定模板示例化(如果可能的话)。
我最好的猜测是类似下面的代码(尽管它显然没有编译):
template<typename ClassT>
class Foo
{
public:
ClassT x;
template<typename MethodT>
void Bar(MethodT arg)
{
}
};
template<typename T>
template<>
void Foo<T>::Bar(T arg)
{
x = arg;
}
2条答案
按热度按时间oxf4rvwz1#
正如在注解中所讨论的,使用模板专门化是不可能做到这一点的,但是,使用std::enable_if_t和
std::enable_if_t
只有在输入类型arg为true时才会返回有效类型。因此,当MethodT
和ClassT
为相同类型时,模板替换会失败,但非模板重载不会失败。在SFINAE下,模板替换失败是可以的。e1xvtsh32#
通常在考虑函数模板专用化时,重载可以处理它:
当你调用
Bar
时,其中一个候选者是函数模板专门化,另一个则不是。可以把类模板想象成在示例化时尽可能地去掉真实的的、具体的成员函数。在重载解析中有一个规则,如果它与那一点有联系,那么它更喜欢不是函数模板专门化的函数。最后得到的是当类型中存在“精确匹配”时调用的第二个重载(这允许顶层
const
存在差异)。如果精确匹配太窄,可以限制第一个重载以扩展第二个重载: