13

我试图找出嵌套模板类的显式特化的正确语法。下面的代码将更好地说明:

struct Column_Major;
struct Row_Major;

template<size_t rows, size_t cols, typename T, typename Allocator>
class Matrix
{

    /* bunch of members */
    template <typename storage = Column_Major>
    class Iterator
    {
        /* bunch of members */
    };
};

我想为 写一个明确的template <> class Matrix<...>::Iterator<Row_Major特化,但语法让我望而却步。我怀疑如果没有对包含类 Matrix 的显式特化,就不可能显式特化 Iterator 类。但如果有办法做到这一点,我会很高兴。

我知道我可以使 Iterator 类成为一个单独的类,而不是 Matrix 类的成员,但是这样嵌套的类允许我完全访问 Matrix 类的模板参数和数据成员,这简化了事情。我知道如果需要我可以解决这个问题,但我首先想调查和了解嵌套方法的可能性。

谢谢, 什穆尔

4

3 回答 3

17

对于显式特化,您需要在内部类之前特化外部类,例如可以看到这个问题

有一个使用部分专业化的解决方法:

template<size_t rows, size_t cols, typename T, typename Allocator>
class Matrix
{

    //                           Notice the additionnal dummy parameter
    //                                       vvvvvvvvvvvvv
    template <typename storage = Column_Major, bool = true>
    class Iterator
    {
    };

    // Specialization
    template <bool dummy>
    class Iterator<Row_Major, dummy>
    {
    };
};
于 2013-10-29T16:24:27.220 回答
2

您可以使用 C++11 使 Synxis 答案(使用默认的虚拟参数)更加干净:

/// template <typename X>, not needed for the example
struct Outer
{
private:
    template <typename A, typename D = void>
    struct Inner
    {
        Inner()  { cout << "default" << endl; }
    };
    template <typename D>
    struct Inner<int,D>
    {
        Inner()  { cout << "int" << endl; }
    };  
public:
    template <typename T>
    using  Nested = Inner<T>;
};

这种改进的好处是嵌套的签名只有一个模板参数,我认为如果你想在模板元编程中正确匹配它会有所帮助。

于 2014-09-02T22:31:49.527 回答
0

我很惊讶嵌套类的模板参数不是父类的参数。

嵌套类可以使用父类的模板参数,这将嵌套类与父类更紧密地联系在一起。您对迭代器一词的使用表明这很好,迭代器肯定会迭代父级包含的相同类型?

我会这样做:

template <class T>
class Outer
{
public:
    class Inner
    {
        void Fn( T in )
        {
        }
    };
};

// specialisation
void Outer<double>::Inner::Fn( double in )
{

}
于 2013-10-29T16:30:05.680 回答