【问题标题】:C++ template typedefC++ 模板类型定义
【发布时间】:2011-02-17 05:03:45
【问题描述】:

我有课

template<size_t N, size_t M>
class Matrix {
    // ....
};

我想创建一个typedef,它创建一个Vector(列向量),它等效于大小为N 和1 的Matrix。类似的东西:

typedef Matrix<N,1> Vector<N>;

这会产生编译错误。以下创建了类似的东西,但不完全是我想要的:

template <size_t N>
class Vector: public Matrix<N,1>
{ };

是否有解决方案或不太昂贵的解决方法/最佳实践?

【问题讨论】:

    标签: c++ templates c++11 typedef


    【解决方案1】:

    C++11 增加了别名声明,是typedef的泛化,允许模板:

    template <size_t N>
    using Vector = Matrix<N, 1>;
    

    Vector&lt;3&gt; 类型等价于Matrix&lt;3, 1&gt;


    在 C++03 中,最接近的近似值是:

    template <size_t N>
    struct Vector
    {
        typedef Matrix<N, 1> type;
    };
    

    这里,Vector&lt;3&gt;::type 类型等价于Matrix&lt;3, 1&gt;

    【讨论】:

    • 哦,太好了,我没有看过 C++0x 的这一部分,而且我对模板化 typedef 有一段时间了……我想我应该更彻底地阅读最终草案.
    • 继承构造函数会让OP原来的解决方案更可行吗?
    • @StackedCrooked:取决于他的目标。当组合可以使用时,我会避免继承(是的,继承构造函数会使这两个更容易),但当 typedef 可以使用时,我也会避免组合。
    • using 不支持专业化,如果我没记错的话,所以第二个选项在很多情况下仍然有用。
    • @UtkarshBhardwaj 请注意,您可以将两者结合起来,类似于 &lt;type_traits&gt; 包含别名声明的方式,例如 std::remove_reference_t 引用 std:::remove_reference 的各种特化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2019-06-09
    • 2019-04-23
    相关资源
    最近更新 更多