仅专门化(模板类)的一个方法(的一部分)

时间:2017-10-31 12:33:24

标签: c++ templates template-specialization specialization

如果我有模板类

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;,对当前代码的影响最小(方法签名的重复次数减少,子类化次数减少),我该怎么做?

编辑:我在C ++ 11中开发

2 个答案:

答案 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;
}