将模板类型名称添加到两个模板 类

Adding a template typename to two template classes

我在C++上使用模板技术像继承一样学习了这段代码。此代码有效。

#include <iostream>
using namespace std;

template < typename T >
class Base {
public:
    explicit Base(const T& policy = T()) : m_policy(policy) {}
    void doSomething() 
    {
        m_policy.doA();
        m_policy.doB();
    }
private:    
    T m_policy;
};

class Implemented {
public:
    void doA() { cout << "A"; };
    void doB() { cout << "B"; };
};

int main() {
    Base<Implemented> x;
    x.doSomething();
    return 0;
}

但是,是否可以在 doA 和 doB 中添加新类型名称 S 的参数?例如,此代码因 type/value 不匹配错误而无效。

#include <iostream>
using namespace std;

template < typename T, typename S >
class Base {
public:
    explicit Base(const T& policy = T()) : m_policy(policy) {}
    void doSomething() 
    {
        m_policy.doA(m_s);
        m_policy.doB(m_s);
    }
private:    
    T m_policy;
    S m_s;
};

template < typename S >
class Implemented {
public:
    void doA(S& s) { cout << "A" << s; };
    void doB(S& s) { cout << "B" << s; };
};

int main() {
    Base<Implemented, int> x;
    x.doSomething();
    return 0;
}

我想我必须让 class Base 和 Implemented 都知道 main() 中 S 的实际类型。我该如何解决这个问题?提前感谢您的帮助。

这一行:

Base<Implemented, int> x;

Implemented 不再是一个类型,现在你把它变成了一个模板。但是 Base 仍然需要一个类型 - 所以给它一个:

Base<Implemented<int>, int> x;

当 Implemented 是 class 时,您使用了模板参数 T。现在 Implemented 是一个模板 class,您需要使用所谓的模板模板参数,如下所示:

#include <iostream>
using namespace std;

template < template <class TS> class T, typename S >
class Base {
public:
    explicit Base(const T<S>& policy = T<S>()) : m_policy(policy) {}
    void doSomething() 
    {
        m_policy.doA(m_s);
        m_policy.doB(m_s);
    }
private:    
    T<S> m_policy;
    S m_s;
};

template < typename S >
class Implemented {
public:
    void doA(S& s) { cout << "A" << s; };
    void doB(S& s) { cout << "B" << s; };
};

int main() {
    Base<Implemented, int> x;
    x.doSomething();
    return 0;
}