在不指定模板参数的情况下引用非依赖名称
refer to a non-dependent name without specifying template parameter
考虑以下因素:
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
这样的东西是无效的。
为了在 运行 时有一些可用的东西,您必须实例化模板,提供最少数量的参数以生成 class,其中的子类型可以在运行次。
考虑以下因素:
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
这样的东西是无效的。
为了在 运行 时有一些可用的东西,您必须实例化模板,提供最少数量的参数以生成 class,其中的子类型可以在运行次。