Прежде всего, я сожалею о неопределенном названии этого вопроса. Я не был уверен, как это обобщить.C++ шаблон специализации/перегрузки
Я хочу достичь следующего: я хочу иметь возможность передавать шаблонные непиковые параметры разных типов в один и тот же шаблон класса, что приводит к различным экземплярам. Что-то вроде этого:
Foo<1>();
Foo<'1'>(); // different types of object
Я не думаю, что это возможно, поэтому я вынужден сделать что-то вроде этого
template <typename T, T Val>
struct Foo;
template <int Val>
struct Foo<int, Val>
{};
template <char Val>
struct Foo<char, Val>
{};
//...
Foo<int, 1>();
Foo<char, '1'>();
таким образом, что Foo
могут быть специализированы на основе первого параметра шаблона. Однако это усложняет синтаксис мини-языка, который я пытаюсь реализовать в своей структуре метапрограммирования. Есть ли какая-либо техническая возможность, которая позволяет мне отличать Foo<1>
от Foo<'1'>
? В основном то, что я хочу сделать, это установить флаг времени компиляции (в перечислении), чтобы указать, что передано int
или char
, без явного указания их.
EDIT Ответов я понял, что мой вопрос подразумевает, что я на самом деле нужен (во время компиляции) экземпляры этих объектов. Я не ...
Скажем, что-то стандарт позволит мне перегрузить шаблон класса таким образом, чтобы Foo<1>
и Foo<'1'>
различные типы и содержат различные значения для их flag
поля. Эти типы могут затем сами быть переданы в другой шаблон класса, который может осмотреть их и сделать интересные вещи с ним, например:
template <typename FooType>
struct Bar
{
typedef typename If < FooType::flag, int, char >::Type Type;
};
Это все очень легко сделать, когда вы не имеете ничего против прохождения типа в явном виде, но это кажется излишним ...
Да, я никогда не думал об этом. +1 –
Я тоже, до тех пор, пока я не нуждался в этом ;-) – JorenHeit
Это выглядит более общим случаем [моего вопроса] (http://stackoverflow.com/q/9400581/212858), чей ответ я боюсь waasn't поощряющ – Useless