C++ 是否可以强制新的模板实例化?
我希望有如下(psuedo-C++)类。其基本思想是,任何新值都将初始化为最后一个设定值 StickyData.hppC++ 是否可以强制新的模板实例化?,c++,templates,C++,Templates,我希望有如下(psuedo-C++)类。其基本思想是,任何新值都将初始化为最后一个设定值 StickyData.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)
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;
模板
类粘性数据{
静态T s_值;
T m_值;
StickyData(){m_value=s_lastValue;}//初始化为最后一个设置值
T&运算符=(T&rhs){
m_值=s_lastValue=rhs;
}
}
模板StickyData::s_lastValue;
UseData.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 int-Ford;
typedef int-GM;
丰田公司;
粘性数据;
粘性数据年度股东大会;
粘性数据原子;
aFord=10;
年度股东大会=2
aToyota=20;
StickyData anotherFord;//我想让它自动初始化为10
为了让它工作,我需要对这些typedef中的每一个进行唯一的粘性数据编译。实际上,我认为这将按原样工作,但当我运行这段代码时,似乎我只为所有这些不同的模板实例化创建了1个静态int
我可以为相同的基础值类型强制编译新模板吗?在您的示例代码中,福特、GMs和丰田都是相同的类型。您应该将它们声明为实际的单独类型:
struct Toyota {};
struct Ford {};
struct GM {};
目前,您的代码等同于:
HoldData<int> aFord;
HoldData<int> aGM;
HoldData<int> aToyota;
回应注释:“……但是编译器确实知道区别,例如,如果您有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);
^
<代码> int <代码>是代码> int <代码>是代码> Ford < /Corp>是代码> GM< /COD> <代码>丰田< /代码>。<代码> TyPulf< /Cort>在C++中创建类型别名,而不是新类型。@ JROK DAMIMIT-我从一个基本示例切换到了稍微复杂的实际情况,以防万一有人对如何实现这一点有更好的想法。但是我没有完成代码的编辑。。。我已经为子孙后代更新了这个问题。是的,代码与之相当,但并不完全相同(也就是说,如果我说#define Ford int,我会得到这个结果——但是编译器确实知道其中的区别,例如,如果你有一个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);
^