引用非依赖名称而不指定模板参数

refer to a non-dependent name without specifying template parameter

本文关键字:参数 依赖 引用      更新时间:2023-10-16

考虑以下内容:

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这样的东西是无效的。

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