将模板类型名称添加到两个模板 类
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;
}
我在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;
}