如果我有模板类
template<typename T>
class C {
public:
void method1() { ... }
void method2() { ... }
std::string method3(T &t) {
// ...
std::string s = t.SerializeToString();
// ...
return s;
}
// ...
};
我希望将其专门用于T = std::string
,但只更改method3(T&)
(保留所有其他方法),甚至更好,只改变方法3的那部分,T = std::string
只会变成std::string s = t;
,对当前代码的影响最小(方法签名的重复次数减少,子类化次数减少),我该怎么做?
答案 0 :(得分:3)
如果您只需要更改 private void ConfigureAuth(IAppBuilder app)
{
var azureADBearerAuthOptions = new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters()
{
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
}
};
app.UseWindowsAzureActiveDirectoryBearerAuthentication(azureADBearerAuthOptions);
}
的初始化,则可以使用重载:
s
在C ++ 17中,您可以使用std::string init(std::string& t)
{
return t;
}
template <typename T>
std::string init(T& t)
{
return t.SerializeToString();
}
template <typename T>
std::string method3(T &t) {
// ...
std::string s = init(t);
// ...
return s;
}
:
if constexpr
在C ++ 14中,您可以使用static_if:
std::string method3(T &t)
{
if constexpr(std::is_same_v<T, std::string>)
{
std::string s = t;
// ...
return s;
}
else
{
std::string s = t.SerializeToString();
// ...
return s;
}
}
答案 1 :(得分:2)
您可以使用这样的专业化(无需专门化整个班级):
template<>
std::string C<string>::method3(string &t) {
// ...
std::string s = t;
// ...
return s;
}