c++ - 成员变量如何与专门的类模板一起使用?

标签 c++ templates template-specialization member-variables

我正在尝试编写一个非常简单的专用类模板,它具有一个成员变量,并且可以在特殊情况下以不同的方式打印该成员变量。我知道这个例子没什么用,但它很好地说明了问题。

当专门化类模板时,类的专门化似乎不共享相同的成员变量,因此以下代码将无法编译...

#include <iostream>
#include <string>

// Class template
template <typename T>
struct S
{
    S(const T& t)
        : t(t)
    {}

    void print()
    {
        std::cout << t << std::endl;
    }
private:
    T t;
};

// Specialization
template <>
struct S<std::string>
{
    void print()
    {
        // ERROR: "t" is not defined in this context
        std::cout << "string: " << t << std::endl;
    }
};

这表明我需要为每个特化编写一个单独的构造函数,并为每个特化有一个单独的成员变量t,这感觉如果我的话,它很快就会变成大量重复的代码和工作。有很多专业。

如果我所说的是真的,那么在专门的类模板中完全使用成员变量是一种不好的做法吗?是否有任何替代方案可以减少代码重复?

最佳答案

另请看看@0x499602D2的答案,它更简单并且适用于许多实际案例。

你是对的,特化基本上完全独立于彼此和原始模板,所以你必须编写所有新的东西。解决这个问题的一种方法是使用继承。

#include <iostream>
#include <string>

// Class template
template <typename T>
struct Base
{
    Base(const T& t)
        : t(t)
    {}

    virtual void print()
    {
        std::cout << t << std::endl;
    }

protected:
    T t;
};

template<class T>
struct S: Base<T> {
};

// Specialization
template <>
struct S<std::string>: Base<std::string>
{
    void print() override
    {
        std::cout << "string: " << t << std::endl;
    }
};

关于c++ - 成员变量如何与专门的类模板一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59504564/

相关文章:

c++ - 不连续的嵌套命名空间

c++ - Visual Studio F5、ctrl+F5 或在 Visual Studio 之外运行有什么不同?

java - 修改IntelliJ中Java代码编辑器生成 `toString`方法使用的模板

c++ - 如何创建一种变量的 vector ?

c++ - 禁用函数模板特化或使用constexpr变量重载

c++ - 在这种情况下如何决定堆栈、堆和 boost::pool 分配?

c++ - 模数是否在幕后使用 float ?

c++ - C++模板特化/部分和全部

c++ - 仅在头文件中静态模板化成员函数的模板行为

c++ - 为什么 template<classTp> bool is_array<Tp[]> 是 template<class T> bool is_array<Tp> 的部分特化?