2016-10-19 8 views
2

2つのパラメータを1つの関数で使用するテンプレートの指定が必要です。ここにコードのサンプルがあります。1つの関数内で複数のテンプレートパラメータを使用したテンプレートの指定

#include <iostream> 
#include <string> 
template <typename T> 
class Printer 
{ 
    public: 
    T value; 
    Printer(T value) 
    { 
     this->value = value; 
    } 
    void print(); 
    }; 


template <typename T> void Printer<T>::print() 
{ 
    std::cout << value << "\n"; 
} 
template <> void Printer<std::string>::print() 
{ 
    std::cout << "\"" << value <<"\"\n"; 
} 

template <> void Printer<const char *>::print() 
{ 
    std::cout << "\"" << value <<"\"\n"; 
} 

int main() 
{ 
    Printer<int> print1(2); 
    Printer<std::string> print2("Printing string"); 
    Printer<const char *> print3("Printing char*"); 
    print1.print(); 
    print2.print(); 
    print3.print(); 
} 

私は1つの関数にstd::stringconst char *のテンプレートspeciazationを作ることができる方法はあります。彼らは同じことをしているので、私はこれが欲しい。

答えて

3

種類を使用して、種類に基づいて特定の動作に間接参照を追加できます。

#include <iostream> 
#include <string> 
template <typename T> 
class Printer 
{ 
    public: 
    T value; 
    Printer(T value) 
    { 
     this->value = value; 
    } 
    void print(); 
    }; 

template<typename T> 
struct PrinterTypeTraits { 
    static constexpr char* prefix = ""; 
    static constexpr char* postfix = ""; 
}; 

template<> 
struct PrinterTypeTraits<std::string> { 
    static constexpr char prefix = '\"'; 
    static constexpr char postfix = '\"'; 
}; 

template<> 
struct PrinterTypeTraits<const char*> : PrinterTypeTraits<std::string> {}; 

template <typename T> void Printer<T>::print() 
{ 
    using Traits = PrinterTypeTraits<T>; 
    std::cout << Traits::prefix << value << Traits::postfix << '\n'; 
} 


int main() 
{ 
    Printer<int> print1(2); 
    Printer<std::string> print2("Printing string"); 
    Printer<const char *> print3("Printing char*"); 
    print1.print(); 
    print2.print(); 
    print3.print(); 
    return 0; 
} 
関連する問題