gpt4 book ai didi

c++ - 从组合类公开模板参数的替代方法

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:07 34 4
gpt4 key购买 nike

我正在通过添加一个模板化的数据成员来修改一个类。代码将始终在所有调用中为模板参数使用默认模板类型,除了一个地方。部分出于此动机,部分由于愿望/心血来潮,我不想向类添加模板参数,如下所示:

#include <iostream>

template <typename Der>
class A : private Der {
public:
int get() { return Der::get_(); }
};

class B {
protected:
int get_() { return 20; }
};

class C {
protected:
int get_() { return 30; }
};

using Default = B;

template <class T = Default>
class User {
public:
User() {}

A<T>& getMember() { return m_; }

private:
A<T> m_; // This is what I am adding, and exposing param T.
};

int main(int argc, char* argv[]) {
User h;
std::cout<<h.getMember().get()<<std::endl;
}

我能想到的一个解决方案是使用求和类型,但这引入了一些异常处理代码:

class User {
public:
User() : m_(A<Default>()) {}

template <typename T>
User(const T& in) : m_(in) {}

template <typename T>
A<T>& getMember() { return std::get<A<T>>(m_); }

private:
std::variant<A<B>, A<C>> m_;
};

我在找:

  • 我正在尝试做的事情的名称(如果存在)。
  • 我可以通过哪些方式实现我的愿望。

最佳答案

这不是一个答案,因为我发现虚函数调用并不完全令人满意,但是,随着进步,我可以分享的另一个选择是使用内部基类进行类型删除。

类似于:

#include <iostream>
#include <memory>

class User {
public:
template <class T>
User(T&&) : m_(new Internal<T>()) {}

int doOnMember() { return m_->doOnMember(); }

private:
class InternalBase {
public:
virtual int doOnMember() = 0;
};

template <typename T>
class Internal : public InternalBase {
public:
Internal() {}
int doOnMember() { return m_.get(); }

private:
A<T> m_;
};

private:
std::shared_ptr<InternalBase> m_;
};

int main(int argc, char* argv[]) {
User h(B{});
std::cout<<h.doOnMember()<<std::endl;
User h1(C{});
std::cout<<h1.doOnMember()<<std::endl;
}

关于c++ - 从组合类公开模板参数的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58262492/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com