Полиморфизм на основе typeded
|
От: |
ilejn
|
|
Дата: | 24.06.11 13:07 |
|
Оценка: |
|
Здравствуйте.
Хочется научиться вызывать специфический вариант некоторой функции для
особым образом промаркированных структур.
Маркером выступает typedef.
Беда в том, что вот этот код
==
template <typename T>
struct NotPresent
{
typedef int raw_mark;
};
template <typename T>
struct NotPresent<typename T::raw_mark>
{
};
template <typename T>
void
ftag(const T& arg, typename NotPresent<T>::raw_mark dummy = 0)
{
std::cout << "simple" << std::endl;
}
template <typename T>
void
ftag(const T&, typename T::raw_mark dummy = 0)
{
std::cout << "raw marked" << std::endl;
}
struct BMarked
{
typedef int raw_mark;
int field;
};
struct CNotMarked
{
int field;
};
int
main(int, char**)
{
int a;
BMarked b;
CNotMarked c;
ftag<int>(a);
ftag<BMarked>(b);
ftag<CNotMarked>(c);
}
==
всем хорош, но не компилируется с рассказом про неоднозначность вызова ftag для BMarked.
Абсолютно не понимаю, откуда берется NotPresent<T>::raw_mark для BMarked.
Пока на собственное сообщение не было ответов, его можно удалить.