c++ - 将默认值列表传递给模板类

标签 c++ templates

不确定这是否可以使用模板完成,但我想试一试。

我有一个模板类,它接受任何结构,存储它并返回它。此外,我想要一个在需要时重置结构数据的接口(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/

相关文章:

c++ - 如何使用编译时索引参数迭代参数包的大小

c++ - vector 中 N 个最小值的索引

c++ - 控制结构让我失望

c++ - 使用 C++ 计算 csv 中列数的迭代器

c++ - 明确禁止具体类模板特化

amazon-web-services - 如何在 CloudFormation 模板中使用可选的 Parameter Store 参数?

c++ - 为什么要费心使用 Apache 或 Nginx 等?

c++ - 关于免费静态函数使用的文章

c++ - 使用继承的类模板避免公共(public)成员不可见和源代码膨胀/重复的更好方法?

c++ - 如何为 ostream 的 operator<< 模板