首页 > 解决方案 > 尝试理解变量模板和模板别名以正确使用

问题描述

我之前问过这两个问题:

我的问题与第一个问题中提供的课程有关,这是我的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;
    }
};

现在,当访问这个变量时,我有两个选择,我可以使用范围解析运算符通过静态函数访问它,或者我可以通过对象的非静态成员函数访问它。

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>();

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

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

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

如果不是,我想看看其他可能的实现。

标签: c++c++17template-aliasesvariable-templatestemplate-variables

解决方案


推荐阅读