2

考虑以下:

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

我想在NonDependent不指定任何模板参数的情况下引用,如Foo::NonDependent.

我知道我总是可以使用一个虚拟参数:

Foo<WhateverSuits>::NonDependent bla;

但这很丑陋,并且由于NonDependent关于 是不变的T,我想在不依赖虚拟对象的情况下引用它。可能吗?

谢谢

4

2 回答 2

6

您不能在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;
于 2018-07-19T10:17:06.333 回答
0

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

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

于 2018-07-19T13:41:04.730 回答