按类型在一组数据成员中进行选择,其中每种类型仅使用一次

Choosing among a set of data members by type, where each type is used only once

本文关键字:类型 种类 一次 一组 数据成员 选择 行选      更新时间:2023-10-16

我有相同的类模板C,它被许多不同类型T参数化,作为各种派生类中的数据成员。然而,我知道,在任何给定的派生类中,比如' derived ',每个T只在derived的数据成员中用作参数一次。因此,原则上,从基类继承的方法(这里是'f')应该能够在给定类型t时选择这些参数化数据成员中的一个。

下面的代码给出了我要做的一个例子,但只涉及一种类型:

template<typename T>
class C {};
class Base {
    template<typename T>
    void f() {
        // For example, if T is MyType, I want to end up accessing 'instance_for_myType'
    }
};
class Derived : Base {
    C<MyType> instance_for_myType;
};

本质上,我希望能够根据数据成员的类型查找数据成员:Base的派生类将对这些数据成员有自己的标识符,对于Base来说,必须在所有这些标识符之间"切换"是浪费的。

谢谢!

我将尽力澄清我的意图。我想利用相同的泛型代码,f,在类模板C的每一次出现,碰巧是在派生的实例。如果我在所有派生类中只有一个出现,那么在f和Base中硬编码其标识符并删除f上的模板将是一件简单的事情。

我写上面代码的方式并不是为了建议我必须如何实际去实现它——它只是一个概念表示。本质上,我认为,我是在尝试按类型"查找"数据成员。如果DeadMG是对的,那么我可能就没那么幸运了。

很抱歉造成了混乱

如果您不需要 instance在派生类中,那么在我看来这就是您想要的:

template<typename T>
class C {}
template<typename T>
class Base {
    C<T> instance;
    void f() {
        // do stuff with instance
    }
};
class Derived1 : Base<MyType1> {};
class Derived2 : Base<MyType2> {};
// etc.

如果你需要一个共同的基础,只需添加另一层继承;例如,可能是IBase

因此,原则上继承自基类的方法,这里是'f',应该能够选择这些参数化数据中的一个

一点也不。您知道它,但是编译器根本不可能知道它、执行它或为它提供一个特性。此外,编译器不可能知道对象在内存中的位置,除非对派生类进行严格的进一步限制,而语言无法表达这些限制。

长话短说,如果不认真改变你的设计参数,这是不可能做到的。