Прежде всего, я прошу прощения за расплывчатое название этого вопроса. Я не был уверен, как обобщить это.
Я хочу добиться следующего: я хочу иметь возможность передавать нетиповые параметры шаблона разных типов в один и тот же шаблон класса, что приводит к различным экземплярам. Что-то вроде этого:
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;
};
Это все очень легко сделать, когда вы ничего не имеете против передачи типа явно, но это кажется излишним...
template<int Val>
, а другой — какtemplate<char Val>
, или компилятор будет бормотать о нескольких определениях? - person Sebastian Hoffmann   schedule 10.01.2014