不确定这是否可以使用模板完成,但我想试一试。
我有一个模板类,它接受任何结构,存储它并返回它。此外,我想要一个在需要时重置结构数据的接口(interface)。
#define MYDEFAULT {1,2,3}
template < typename ITEM, ITEM Default>
class myClass{
public:
myClass(ITEM item) : _item(item) {}
const ITEM* get(){
return &_item;
}
void reset(){
_item = Default;
}
ITEM _item;
};
// Set to default when instantiated
myClass<myStruct, MYDEFAULT> ABC(MYDEFAULT);
当然这根本不起作用,但我想要实现的是替换 reset()
中的 Default
。我的意思是,如果 _item
的类型是 int
,它就会工作。
如何实现?
编辑:我想要这样的东西:
template <typename Y, Y T>
class myclass {
public:
void reset() {
xxx = T;
}
Y xxx{10};
};
void test()
{
myclass<int, 5> _myclass;
}
最初 xxx 是 10,在调用 reset 后它是 5。这行得通,所以 POD 或类类型似乎是不可能的?
EDIT2:似乎都是关于非类型模板参数的。 https://stackoverflow.com/a/2183121/221226 所以在使用结构时没有办法绕过特征。
最佳答案
作为可行的解决方案,您可以使用特征类,如以下工作示例所示:
#include<cassert>
struct S {
int i;
};
template<typename T>
struct Traits {
static constexpr auto def() { return T{}; }
};
template<>
struct Traits<S> {
static constexpr auto def() { return S{42}; }
};
template <typename ITEM>
class myClass {
public:
myClass(): _item(Traits<ITEM>::def()) {}
myClass(ITEM item): _item(item) {}
const ITEM* get() {
return &_item;
}
void reset() {
_item = Traits<ITEM>::def();
}
ITEM _item;
};
int main() {
myClass<S> ABC{};
myClass<int> is;
assert((ABC.get()->i == 42));
assert((*is.get() == 0));
}
基本特征使用 ITEM
类型的默认构造函数。
然后,只要您需要特定类的不同默认值,就可以对其进行专门化。
即使使用工厂函数也可以完成同样的事情:
template<typename T>
constexpr auto def() { return T{}; }
template<>
constexpr auto def<S>() { return S{42}; }
无论如何,traits 可以轻松地同时提供更多的类型和功能。
关于c++ - 将默认值列表传递给模板类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38954799/