Один из моих коллег рассказал мне о небольшом дизайне, которое он использовал со своей командой, которая послала мой мозг. Это своего рода класс признаков, который они могут специализировать в чрезвычайно развязанной форме.
Мне было трудно понять, как это может работать, и я все еще не уверен в своей идее, поэтому я подумал, что попрошу о помощи здесь.
Мы говорим g++ здесь, в частности версии 3.4.2 и 4.3.2 (похоже, они работают с обоими).
Идея довольно проста:
1- Определить интерфейс
// interface.h
template <class T>
struct Interface
{
void foo(); // the method is not implemented, it could not work if it was
};
//
// I do not think it is necessary
// but they prefer free-standing methods with templates
// because of the automatic argument deduction
//
template <class T>
void foo(Interface<T>& interface) { interface.foo(); }
2- Определите класс, а в исходном файле специализируйте интерфейс для этого класса (определяя его методы)
// special.h
class Special {};
// special.cpp
#include "interface.h"
#include "special.h"
//
// Note that this specialization is not visible outside of this translation unit
//
template <>
struct Interface<Special>
{
void foo() { std::cout << "Special" << std::endl; }
};
3- Чтобы использовать, это просто:
// main.cpp
#include "interface.h"
class Special; // yes, it only costs a forward declaration
// which helps much in term of dependencies
int main(int argc, char* argv[])
{
Interface<Special> special;
foo(special);
return 0;
};
Это символ undefined, если единица перевода не определила специализацию Interface
для Special
.
Теперь я бы подумал, что для этого потребуется ключевое слово export
, которое, насколько мне известно, никогда не было реализовано в g++ (и реализовано только один раз в компиляторе на С++, а его авторы советуют кому-то не делать этого, учитывая время и усилия, которые им потребовались).
Я подозреваю, что это как-то связано с компоновщиком, разрешающим методы шаблонов...
- Вы когда-либо встречали что-либо подобное раньше?
- Соответствует ли он стандарту или вы считаете, что это удачное совпадение, которое оно работает?
Я должен признать, что я довольно озадачен конструкцией...