对模板方法的特定专业化使用不同签名的正确方法
Correct way to use different signature to specific specialization of template method
假设您有以下模板方法:
class A
{
template<typename T>
void f(const T& t)
{
// do something with t.
}
};
现在,除了 T:
之外,我想要针对特定 class 的 f() 的不同实现
class A
{
template<typename T>
void f(const T& t)
{
// do something with t.
}
void f(const std::string& t)
{
// do something ELSE with t if T is std::string.
}
};
我知道我可以在模板方法上使用 std::enable_if<>(准确地说是 "disable_if"),但我不喜欢该解决方案,因为模板方法 "knows" 关于其他实现。
有没有更好的更正确的方法?
你展示的是超载,而不是专业化。它应该像写的那样工作:你有什么问题?
无论如何,专业化应该是这样的:
// Outside of the class definition:
template <>
inline void A::f<std::string>(const std::string& t) { ... }
注意这个特化不再是一个模板函数,而是一个普通的成员函数,只是有一个花哨的名字。所以它应该在头文件中声明并在源文件中定义,或者在头文件中使用 inline
关键字定义(我的示例显示后者)。
假设您有以下模板方法:
class A
{
template<typename T>
void f(const T& t)
{
// do something with t.
}
};
现在,除了 T:
之外,我想要针对特定 class 的 f() 的不同实现class A
{
template<typename T>
void f(const T& t)
{
// do something with t.
}
void f(const std::string& t)
{
// do something ELSE with t if T is std::string.
}
};
我知道我可以在模板方法上使用 std::enable_if<>(准确地说是 "disable_if"),但我不喜欢该解决方案,因为模板方法 "knows" 关于其他实现。
有没有更好的更正确的方法?
你展示的是超载,而不是专业化。它应该像写的那样工作:你有什么问题?
无论如何,专业化应该是这样的:
// Outside of the class definition:
template <>
inline void A::f<std::string>(const std::string& t) { ... }
注意这个特化不再是一个模板函数,而是一个普通的成员函数,只是有一个花哨的名字。所以它应该在头文件中声明并在源文件中定义,或者在头文件中使用 inline
关键字定义(我的示例显示后者)。