c++ - 与模板化成员方法同名的普通成员方法

标签 c++ c++11

我正在尝试创建一个名为 duo 的类。

duo 是一个类,它存储任何类型的对象 T 以及 std::string 这是“文本"T 对象的版本。 (例如,如果 T 是一个 int,比如 861,那么它的字符串版本将是 "861" .)

想法是有一个显示字符串和一个值。我计划使用 VALUE 来比较两个 duo,而 NAME 将在我需要时用于显示字符串。

它应该能够从 std::stringT 构造。换句话说,如果我说

std::string num("861");
duo<int> anumber(num);

这将创建与我创建的对象相同的对象

duo<int> anumber(861);

它的目的是将两者进行转换和存储,以便以后可以使用它们而不必再次调用转换函数。我需要能够访问“值”和“名称”。

如果 duo 是使用“普通版本”构建的(传递 std::string),VALUE 将从 名称。如果它是使用“模板化版本”构造的(传递类型为 T 的对象),NAME 将从 value 转换而来。

template< class T >
class duo
{
    private:

        T VALUE;

        std::string NAME;

    public:

        // Templated version
        duo( const T& value );

        // Normal version
        duo( const std::string& name );
};

T 有什么办法可以是 std::string 吗?我该怎么做呢?谢谢。

最佳答案

您需要模板特化。请看下面的代码:

template< class T >
class duo
{
    private:    
        T VALUE;
        std::string NAME;
    public:
        // Templated version
        duo( const T& value ) : NAME(value), VALUE(value)  // please make sure that NAME(value) works!
        {
            std::cout<<"template version";
        }
};


template<>
class duo<std::string>
{
    private:
        std::string VALUE;
        std::string NAME;
    public:
        // Normal version
        duo( const std::string& name ): NAME(name), VALUE(name)
        {
            std::cout<<"normal version";
        }
};

int main()
{
    duo<std::string> d(std::string("abc"));  // normal version
    // duo<int> d2(1);  // templated version


    return 0;
}

duo<int> d2(1)不起作用,因为 int无法隐式转换为 std::string .这是您下一步应该做的。

这是链接:http://en.cppreference.com/w/cpp/language/template_specialization

编辑

如果你想专门化构造函数:

template< class T >
class duo
{
    private:
        T VALUE;
        std::string NAME;
    public:
        // Templated version
        template<class V>
        duo(const V& value)
        {
            std::cout<<"template version";
        }
        // Normal version
        duo(const std::string &name)
        {
            std::cout<<"normal version";
        }
};

关于c++ - 与模板化成员方法同名的普通成员方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41261908/

相关文章:

c++ - 带有索引和迭代器的 vector

c++ - 返回类型中不需要模板参数

c++ - Armadillo 是否支持 bool 和 8 位类型的矩阵和立方体?

c++ - 使用可变参数模板的通用访问者

c++ - PrintWindow函数在notepad.exe中出错

c++ - 如何在 Makefile 的 pathsubst 中添加 "or"

c++ - 如何在从模板类继承时应用 move 语义

c++ - 在 C++ 中添加字符串和文字的问题

c++11 - 获取模板以与 C++ 中的接口(interface)的 unique_ptr 良好配合

c++ - 使用 GLUT 按键停止动画?