С моим ограниченным знанием я считаю, что этот будет полезным инструментом, и, похоже, это отношение, которое может существовать между пространствами имен и шаблонами. Некоторые люди утверждают, , что это было бы трудно реализовать и, тем не менее, не нужно.
В приведенном выше примере я бы использовал структуры, а не пространства имен (я использую struct
вместо class
потому что по умолчанию его доступ "публичный").Ниже должен быть полностью компилируемый пример:
#include <iostream>
// Replaces namepace 'A' from above.
templates
struct Option1 {
class Foo;
//Example function, too.
void myFunc() {
std::cout << "Hello!\n";
}
};
// A second Option for example.
struct Option2 {
class Foo;
void myFunc() {
std::cout << "Hola!!\n";
}
};
// Can be in .cpp file
class Option1::Foo {
public:
Foo() { display(); }
void display() {
std::cout << "Option 1.\n";
}
};
class Option2::Foo {
public:
Foo() { display(); }
void display() {
std::cout << "Option 2.\n";
}
};
Шаблон может быть следующим:
// The typename C would need class 'Foo'
template <typename C>
class OptionSelect : public C
{
typename C::Foo* foo;
public:
OptionSelect() {
foo = new typename C::Foo();
}
};
int main() {
OptionSelect<Option1> opt1;
OptionSelect<Option2> opt2;
opt1.myFunc(); // Provided that template had myFunc
opt2.myFunc();
return 0;
}
Результат должен быть следующим при сборке:
Option 1.
Option 2.
Hello!
Hola!!
У меня появилась идея наследовать класс шаблона от здесь , хотя я признаю, что без определения myFunc()
, как я это сделал, наследование шаблона будет необязательным.Статья стоит проверить.В нем есть много полезных и нетрадиционных приемов использования шаблонов.