【问题标题】:C++ - Use inferred template argument from constructor as template argument throughtout classC++ - 使用从构造函数推断出的模板参数作为模板参数贯穿整个类
【发布时间】:2023-03-20 06:43:01
【问题描述】:

我想在我的类的其余部分中使用从构造函数参数推断出的类型作为模板参数。这可能吗?

类似这样的:

    class AnyClass 
    {
    public:
      template<Class C>
      AnyClass(C *c) {
      //class C is inferred by constructor argument
      }
      // constructor argument is used as argument in other template types
      nestclass<C> myNestedClass;
      void randomfunction(C *randonarg) {
      }
    }

详情:

事情就是这样。我正在尝试根据继承类的类型初始化我的基类型。在下面的情况下,DerivedA 继承自 Base,但 DerivedB 继承自 DerivedA,因此据我了解,Base 的构造函数中 this 的值(在 DerivedA 中找到)实际上是指向 DerivedB 的指针,因此推断类型在 @987654324 @ 将是 DerivedB 类型。但是,我想在我的 Base 类的其余部分中使用这种类型,而不仅仅是将其限制在构造函数中。

class Base {

// type T derived from inheriting class
template<T>
Base(T *) {};
//like to use other places
void randomfunction(T *arg1) {
//does something with type T
};
}

class DerivedA : publicBase {

DerivedA() : Base(this) { //this should be a pointer to DerivedB, since it is inherited 
                          //from DerivedB.
}

}

class DerivedB : class DerivedA {
//anything
}

**我的主要目标是在我的基类中使用继承类类型。我意识到这是一种不同的 qst,但我认为我的解决方案会以某种方式在我原来的问题中找到。

我正在考虑使用一种中间方法(类似于下面提出的功能),但不确定它是否会起作用。

感谢您的帮助!

【问题讨论】:

  • 没有。我在下面给出了一个相关问题的答案,但您可以更详细地描述您的用例,也许您遇到的真正问题可以得到解决!
  • 也许你想看看CRTP(奇怪的是重复出现的模板模式)?
  • 是的,CRTP 是执行此操作的正确方法。如果您需要到父级的单个二进制接口,请执行两阶段 CRTP,具有接口类和 CRTP 实现基,然后是派生。

标签: c++ templates constructor


【解决方案1】:

没有。

但是你可以让你的整个类成为一个模板类,并创建一个工厂函数来进行类型推导来生成你的模板类。

template<typename C>
class AnyClass {
public:
  AnyClass( C* c );
  std::vector<C> vec;
};
AnyClass<C> make_any_class( C* c ) {
  return AnyClass<C>(c);
};

【讨论】:

  • 我明白这一点,但我怕它违背了AnyClass的初衷。从名称来看,我倾向于相信 OP 想要实现 boost::any 提供的那种类型擦除
  • @AndyProwl 可能——我推测 OP 想要的是能够从推断的类型构造他们的类,而不是其中包含多种类型的统一类。而且我怀疑boost::function 提供的那种类型擦除会更适合:您使用pImpl 模式存储类型擦除AnyClass_impl&lt;C&gt;* 并将方法从您的AnyClass 转发到您的AnyClass_impl_interface* .但实际上,对 OP 的问题的答案是“否”,为了通过字符限制,我包括了对 OP 没有问的问题的答案。
  • 是的,我明白你的意思(可能类似于this)。但确实对OP的具体问题的直接回答是“否”,所以+1
  • 抱歉耽搁了。我在我的问题中添加了细节。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-08-13
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-12
  • 1970-01-01
  • 2023-02-24
  • 2021-11-01
相关资源
最近更新 更多