c++ - 是否可以强制进行新的模板实例化?

标签 c++ templates

我想要类似下面的 (psuedo-C++) 类。基本思想是任何新值都将初始化为上次设置的值。

粘性数据.hpp

template<typename T>
class StickyData {
  static T s_lastValue;
  T m_value;
  StickyData() { m_value = s_lastValue; } // Initialize to last set value
  T& operator = (T& rhs)  { 
       m_value = s_lastValue = rhs;
  }
}

template<> StickyData<T>::s_lastValue;

使用数据.cpp

typedef int Ford;
typedef int GM;
typedef int Toyota;

StickyData<Ford> aFord;
StickyData<GM> aGM;
StickyData<Toyota> aToyota;

aFord = 10;
aGM = 2
aToyota = 20;

StickyData<Ford> anotherFord; // I want this automatically initialized to 10

为此,我需要为每个 typedef 的 StickyData 进行独特的编译。我实际上认为这会按原样工作,但是当我运行这段代码时,我似乎只为所有这些不同的模板实例创建了 1 个静态整数。

我能否以某种方式为相同的基础值类型强制进行新的模板编译?

最佳答案

在您的示例代码中,福特、通用汽车和丰田汽车都是同一类型。您应该将它们声明为实际的独立类型:

struct Toyota {};
struct Ford   {};
struct GM     {};

目前,您的代码相当于:

HoldData<int> aFord;
HoldData<int> aGM;
HoldData<int> aToyota;

下面是我上面建议的完整实现:​​

#include <iostream>

template<typename Hash, typename Value>
struct StickyData {
        static Value s_lastValue;
        Value m_value;
        StickyData(): m_value(s_lastValue) {}

        StickyData<Hash, Value> & operator=(Value const & rhs) {
                m_value = s_lastValue = rhs;
                return *this;
        }
};

struct GM {};
struct Ford {};
struct Honda {};

template <typename Hash, typename Value> Value StickyData<Hash, Value>::s_lastValue = 0;

int main() {
        StickyData<GM, int> aGM;
        StickyData<Ford, int> aFord;
        StickyData<Honda, double> aHonda;

        aGM = 3;
        aFord = 4;
        aHonda = 7.89;

        std::cout << "aGM:    " << aGM.m_value << "\n";
        std::cout << "aFord:  " << aFord.m_value << "\n";
        std::cout << "aHonda: " << aHonda.m_value << "\n";
        std::cout << "\n";

        StickyData<GM, int> aNewGM;
        std::cout << "aNewGM: " << aGM.m_value << "\n";
}

输出:

aGM:    3
aFord:  4
aHonda: 7.89

aNewGM: 3

回应评论: “......但是编译器确实知道其中的区别,例如,如果你有 typedef'ed 参数,你可以标记一些显式的东西,然后不接受 'int' 类型作为参数......”

我有以下代码:

typedef int foo;

class C {
    explicit C(int x);
    explicit C(foo x);
};

此代码无法编译并出现以下错误:

blah.cc:5:11: error: ‘C::C(foo)’ cannot be overloaded
  explicit C(foo x);
           ^
blah.cc:4:11: error: with ‘C::C(int)’
  explicit C(int x);
           ^

关于c++ - 是否可以强制进行新的模板实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18851540/

相关文章:

C++ 从函数返回更精确的两个模板参数?

c++ - 如何使用指向友元函数的指针作为成员函数的参数

c++ - 为什么 clang 和 gcc 重复代码和分支 vs 无条件跳转到循环内?

c++ - 使用 const char * literal 作为 std::map 键是否安全?

c++ - 我可以从 MSVC 编译的 exe 文件中删除 *.exe.manifest 文件吗?

c++ - 为什么此代码允许访问私有(private)变量

c++ - 如果 lambda 中带有 static_assert 的 constexpr,哪个编译器是正确的?

c++ - 更改关于框中的图标

C++ Qt 如何在滚动区域添加小部件?

c++ - 矩阵模板类 * 运算符必须产生错误