Проблема специализации шаблонов C ++ - PullRequest
3 голосов
/ 26 мая 2009

Мне нужен шаблон C ++, который, учитывая тип и объект этого типа, может принимать решение на основе того, является ли тип целым числом или нет, и в то же время иметь возможность доступа к реальным объектам. Я попробовал это

template <typename T, T &N>
struct C {
    enum { Value = 0 };
};

template <int &N>
struct C<int, N> {
    enum { Value = N };
};

но это не работает. Есть ли способ добиться чего-то подобного?

Редактировать

То, чего я пытался добиться, было что-то вроде этого, что случилось бы во время компиляции:

if (type is int) {
    return IntWrapper<int_value>
else {
    return type
}

Вы можете фактически передавать указатели или ссылки на объекты в экземпляре шаблона, например, так:

struct X {
    static const int Value = 5;
};

template <X *x>
struct C {
    static const int Value = (*x).Value; 
};

X x;

std::cout << C<&x>::Value << std::endl; // prints 5

но, очевидно, все это завершается инициализацией шаблона, выводя тип x, и x также необходимо объявить глобально. Бесполезно то, что я пытаюсь сделать, что, по-моему, невозможно во время компиляции.

Ответы [ 11 ]

0 голосов
/ 26 мая 2009

простое исправление вашего кода - потеряйте ссылку:

template <typename T, T N>
struct C {
    enum { Value = 0 };
};

template <int N>
struct C<int, N> {
    enum { Value = N };
};

Использование ссылки в аргументе шаблона в любом случае бессмысленно, потому что вы нигде не передаете аргумент.

...