在一个函数中使用多个模板参数进行模板指定

时间:2016-10-19 06:12:55

标签: c++ templates

我想在一个函数中使用两个参数进行模板规范。这是一个代码示例。

#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();
}

我是否可以在一个函数中为std::stringconst char *制作模板speciazation。我想要这个,因为他们正在做同样的事情。

1 个答案:

答案 0 :(得分: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;
}