模板中的模板对象

Template object in template

提问人:BENG 提问时间:8/22/2023 最后编辑:BENG 更新时间:8/22/2023 访问量:60

问:

我想要一个参数为 typename T 的模板和一个表示null_object的 T 类型的对象。目标是创建一个容器类,其中对于每种类型,为空构造函数提供给定的null_value。例如

template<typename T, T null_value>
class MyObject {
private:
     std::array<T,4> data;

public:
    MyObject() {
        data.fill(null_value);
    }
};

但是,我不能使用上面给定的语法来做到这一点。我怎样才能做到这一点?如果嵌套模板无法做到这一点,有没有办法为某些给定的模板值定义不同的构造函数?例如

template<typename T>
class MyObject {
private:
    std::array<T,4> data;

public:
    MyObject<int>() {
        data.fill(0);
    }

    MyObject<float>() {
        data.fill(0.0f);
    }

    MyObject<char>() {
        data.fill('a');
    }
};

编辑: 对于某些类型,例如 ,将编译第一个代码块。但是,对于诸如 的类型,块将不会编译。intfloat

C++ 模板 语法

评论

0赞 Tommy 8/22/2023
你有什么理由不能用上面给定的语法来做到这一点?godbolt.org/z/6MhGE9qKn 似乎没问题。您是否看到编译器错误?如果是这样,是哪个?
3赞 paddy 8/22/2023
某些类型(例如 )不能用作模板参数。float
0赞 Tommy 8/22/2023
@paddy好点;作者指出问题是正确的,我查询是错误的。
0赞 BENG 8/22/2023
正确。在测试编译时,我使用了 float 并得到了一个错误。
0赞 Quimby 8/22/2023
是否在构造函数之外的任何地方使用?如果没有,您可以模板化 ctor 或将其作为(默认)参数传递。null_value

答:

2赞 Tommy 8/22/2023 #1

如果问题是“如何根据类型选择填充值”,那么我建议您:

MyObject() {
    if constexpr (std::is_same_v<T, int>) {
        data.fill(0);
    } 
    ... etc ...
}

或者从辅助模板获取值:

template <typename T> struct DefaultValue {};
template <> struct DefaultValue<int> { static constexpr int value = 0; };
template <> struct DefaultValue<float> { static constexpr float value = 0.0f; };
// ... etc ...

template<typename T>
class MyObject {
public:
    MyObject() {
        data.fill(DefaultValue<T>::value);
    }

评论

0赞 BENG 8/22/2023
在第二个代码块中,该部分是否在类的声明中?我不知道您可以在模板中模板化对象。private:MyObject
0赞 Tommy 8/22/2023
@BENG抱歉,不,形式不佳。可以在模板中对对象进行模板化,但不能提供显式专用化,因为这些专用化必须在命名空间范围内。经过编辑,格式正确。