C++ 在不指定模板参数的情况下引用非依赖名称

C++ 在不指定模板参数的情况下引用非依赖名称,c++,templates,dependent-name,C++,Templates,Dependent Name,考虑以下几点: template<typename T> struct Foo { typedef void NonDependent; typedef typename T::Something Dependent; } 但是这很难看,而且由于非依赖性对于T是不变的,所以我想在不依赖虚拟的情况下引用它。可能吗 谢谢如果不指定模板参数,您就不能引用非依赖性,因为它可能会根据模板参数而变化或完全不存在。例如: template&l

考虑以下几点:

template<typename T> struct Foo {
     typedef void                  NonDependent;
     typedef typename T::Something Dependent;
}
但是这很难看,而且由于
非依赖性
对于
T
是不变的,所以我想在不依赖虚拟的情况下引用它。可能吗


谢谢

如果不指定模板参数,您就不能引用非依赖性,因为它可能会根据模板参数而变化或完全不存在。例如:

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

如前所述,这是无法做到的。主要是因为Foo不是运行时可用的类型,而是编译时可用的模板,所以像
Foo::NonDependent
这样的东西是无效的


为了在运行时获得可用的东西,您必须实例化模板,提供最小数量的参数以生成类,其中的子类型可以在运行时引用。

使用
void
代替
NonDependent
@Mohit我假设在实际代码中,它用一个长而难看的名称来别名其他类型,而不是
void
。我怀疑这是可能的,但您可以为
T
添加一个默认值,并改为
Foo::NonDependent
。哦,我懂了。。。显式专门化可能会更改相同名称的定义,甚至将其删除。我喜欢非模板基础解决方案。谢谢
template<> struct Foo<int>
{
   typedef float NonDependent;
};
template<> struct Foo<std::string>
{
   typedef typename std::string::value_type Dependent;
};
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;