引用非相关名称而不指定模板参数

时间:2018-07-19 10:04:58

标签: c++ templates dependent-name

请考虑以下内容:

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

我想引用NonDependent而不指定任何模板参数,例如Foo::NonDependent

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

Foo<WhateverSuits>::NonDependent bla;

但这很丑陋,并且由于NonDependent相对于T是不变的,因此我想引用它而不依赖于虚拟对象。有可能吗?

谢谢

2 个答案:

答案 0 :(得分:5)

如果不指定模板参数,则不能引用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;

答案 1 :(得分:0)

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

要想在运行时提供一些可用的东西,您必须实例化模板,并提供最少数量的参数以生成一个类,该类可以在运行时被引用。