Полиморфизм на основе 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.