Учтите следующее:
template<typename T> struct Foo {
typedef void NonDependent;
typedef typename T::Something Dependent;
}
Я хотел бы сослаться на NonDependent
без указания какого-либо параметра шаблона, как в Foo::NonDependent
,
Я знаю, что всегда могу использовать фиктивный параметр:
Foo<WhateverSuits>::NonDependent bla;
Но это безобразно, и так как NonDependent
инвариантен относительно T
Я хотел бы сослаться на это, не полагаясь на манекен. Является ли это возможным?
Спасибо
Вы не можете ссылаться на 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;
Как было сказано ранее, это не может быть сделано. Главным образом потому, что Foo не является типом, доступным во время выполнения, а скорее шаблоном, доступным во время компиляции, поэтому такие вещи, как Foo::NonDependent
являются недействительными
Чтобы иметь что-то доступное во время выполнения, вы должны создать экземпляр шаблона, предоставив минимальное количество аргументов для создания класса, на какие подтипы можно ссылаться во время выполнения.