обращаться к независимому имени без указания параметра шаблона

Учтите следующее:

template<typename T> struct Foo {
typedef void                  NonDependent;
typedef typename T::Something Dependent;
}

Я хотел бы сослаться на NonDependent без указания какого-либо параметра шаблона, как в Foo::NonDependent,

Я знаю, что всегда могу использовать фиктивный параметр:

Foo<WhateverSuits>::NonDependent bla;

Но это безобразно, и так как NonDependent инвариантен относительно TЯ хотел бы сослаться на это, не полагаясь на манекен. Является ли это возможным?

Спасибо

2

Решение

Вы не можете ссылаться на NonDependent без указания параметра шаблона, поскольку он может изменяться или полностью отсутствовать в зависимости от параметра шаблона. Например:

template<> struct Foo<int>
{
typedef float NonDependent;
};
template<> struct Foo<std::string>
{
typedef typename std::string::value_type Dependent;
};

Вам может понадобиться переехать NonDependent объявление в базовой (не шаблонной) структуре и ссылка на нее:

struct FooBase{ typedef void NonDependent; };

template<typename T> struct Foo: public FooBase
{
typedef typename T::Something Dependent;
};
template<> struct Foo<int>: public FooBase
{
typedef float NonDependent;
};

FooBase::NonDependent bla;
5

Другие решения

Как было сказано ранее, это не может быть сделано. Главным образом потому, что Foo не является типом, доступным во время выполнения, а скорее шаблоном, доступным во время компиляции, поэтому такие вещи, как Foo::NonDependent являются недействительными

Чтобы иметь что-то доступное во время выполнения, вы должны создать экземпляр шаблона, предоставив минимальное количество аргументов для создания класса, на какие подтипы можно ссылаться во время выполнения.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector