代码之家  ›  专栏  ›  技术社区  ›  BENG

模板中的模板对象

  •  1
  • BENG  · 技术社区  · 2 年前

    我想要一个带有参数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');
        }
    };
    

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

    1 回复  |  直到 2 年前
        1
  •  0
  •   Tommy    2 年前

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

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

    或者从辅助模板获取值:

    private:
        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 ...
    
    public:
        MyObject() {
            data.fill(DefaultValue<T>::value);
        }