2017-10-31 11 views
1

私はテンプレートクラスだけ(の一部)は、テンプレートクラスの一つの方法を専門

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&)を変更する場合、またはより良いのは、method3のうち、T = std::stringについては、現在のコードに最小限の影響を与えて(単にシグネチャの反復が少なく、サブクラス化が少ない)、std::string s = t;となるでしょう。

EDIT:

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

:私はあなただけsの初期設定を変更する必要がある場合は、オーバーロードを使用することができますC++ 11

答えて

2

あなたはそのような専門(全クラスを特化する必要はありません)を使用することができます:

​​
+0

を、私は、最小限の例を掲載、しかしで現実私はクラス全体を専門にする必要があります – fferri

+1

@fferri:文字通り**は「テンプレートクラスの1つのメソッドだけを専門にする」と言います**。 –

+0

@ Jarod42:クラスのテンプレートパラメータを削除することをお勧めしますか?または私はあなたの答えを誤解しました。 – fferri

2

をで開発しています、あなたはif constexprを使用することができます。

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

C++ 14では

、あなたはstatic_ifを使用することができます。

std::string method3(T &t) 
{ 
    static_if(std::is_same<T, std::string>{}) 
    .then([](auto& x) 
    { 
     std::string s = x; 
     // ... 
     return x; 
    }) 
    .else_([](auto& x) 
    { 
     std::string s = x.SerializeToString(); 
     // ... 
     return x; 
    })(t); 
} 
関連する問題