代码之家  ›  专栏  ›  技术社区  ›  Francis Cugler

试图理解变量模板和模板别名的正确用法

  •  1
  • Francis Cugler  · 技术社区  · 5 年前

    我之前问过这两个问题:

    Signal 班级。

    我试图在类中传达的想法是,我不希望这个类成为模板。但是,我需要存储一个与“时间”相关的变量,但是有两种方法可以存储它:一种是整数类型:“离散”,另一种是浮点类型:“连续”。

    我在考虑使用模板别名来帮助简化代码。从代码中可以看到:

    template<typename T>
    using TimeSignal = T;
    
    using DiscreteTime = TimeSignal<std::uint64_t>;
    using ContinousTime = TimeSignal<double>;
    

    我就是这么想使用模板别名的。

    class Signal {
    private:
        template<typename T>
        static TimeSignal<T> time_;
    
        // ...
    };
    

    我的模板变量是Signal的成员。现在为了有一个模板变量,它必须是静态的。为了测试这个类,我正在使用它的构造函数来实例化一些东西并将其存储到这个变量中。

    class Signal {
    public:
        template<typename T>
        explicit Signal( TimeSignal<T> time ) {
            time_<T> = time;
        }
    };
    

    现在,在访问这个变量时,我有两个选择,我可以通过使用scope resolution操作符的静态函数来访问它,或者我可以通过对象的非静态成员函数来访问它。

    class Signal {
    public:
        template<typename T>
        auto atTime() { return time_<T>; }
    
        // or
        template<typename T>
        static auto atTime() { return time_<T>; }
    };
    

    现在,为了使类能够正确编译和构建,这一行代码必须在使用它的其他CPP文件的类之外进行反定义:

    template<typename T>
    TimeSignal<T> Signal::time_;
    

    这是可以理解的,因为变量是静态成员。

    这应该给你我的类的当前结构的背景。在继续添加更多内容之前,我想知道一些关于这个代码设计的事情。

    第一个也是更简单的问题是:如果我的代码保持原样;检索变量的首选方法是:

    DiscreteTime t1{ 5 }; // 10 seconds
    ContinousTime t2{ 7.9 }; // 7.9 seconds
    
    Signal s1( t1 ); // Signal S1 using Discrete Time intervals
    Signal s2( t2 ); // Signal S2 using Continuous Time
    
    // Accessing the member variable: which is preferred:
    // via static method and scope resolution?
    auto time1 = Signal::atTime<Discreate>();
    auto time2 = Signal::atTime<Continuous>();
    
    // or through non static object member?
    auto time1 = s1.atTime<Discrete>();
    auto time2 = s2.atTime<Continous>();
    

    下一个问题比上一个问题更重要,因为这会影响整个设计决策。。。

    我关于模板别名的推理是否正确在这种情况下,我最初的想法或意图如下:

    我希望类中的变量模板是 std::uint64_t double ,但我想使用上面的名称: DiscreteTime ContinousTime 将底层类型表示为typedef。

    0 回复  |  直到 5 年前
    推荐文章