C++ 中的模板化类赋值

thc

这可能是一个非常基本的问题,但我搜索并找不到任何东西。

我有一些看起来像这样的代码:

if(var == 1) {
  MyClass<A> x();
  x.doThing1();
  x.doThing2();
  x.doThing3();
  ...
  x.doThing10();
} else if(var == 2) {
  MyClass<B> x();
  x.doThing1();
  x.doThing2();
  x.doThing3();
  ...
  x.doThing10();
} else {
  MyClass<C> x();
  x.doThing1();
  x.doThing2();
  x.doThing3();
  ...
  x.doThing10();
}

我想做的是减少行数,例如:

// obviously non-working code
MyClass<auto> x;
if(var == 1) {
  x<A>();
} else if(var == 2) {
  x<B>();
} else {
  x<C>();
}
x.doThing1();
x.doThing2();
x.doThing3();
...
x.doThing10();

这样的事情可能吗?

来吧狂躁

您可以做一些事情。

在一般情况下,如果您不介意动态内存分配,您可以在虚拟基类中定义接口,在 MyClass 中实现接口,使用任何您需要的模板参数。沿着这些路线的东西:

#include <memory>
#include <iostream>

class Base
{
public:
    virtual void doThing1() const = 0;
    virtual void doThing2() const = 0;
    virtual void doThing3() const = 0;
};

template <class T>
class MyClass: public Base
{
public:
    void doThing1() const {std::cout << T::foo << ".doThing1()" << std::endl;}
    void doThing2() const {std::cout << T::foo << ".doThing2()" << std::endl;}
    void doThing3() const {std::cout << T::foo << ".doThing3()" << std::endl;}
};
struct A {static const char foo = 'A';};
struct B {static const char foo = 'B';};
struct C {static const char foo = 'C';};

std::unique_ptr<Base> makeMyClassInstance(const int var)
{
    switch (var)
    {
        case 1: return std::make_unique<MyClass<A> >();
        case 2: return std::make_unique<MyClass<B> >();
        case 3: return std::make_unique<MyClass<C> >();
        default: throw std::runtime_error("unsupported");
    }
}
int main()
{
    int var = 1;
    const auto x = makeMyClassInstance(var);
    x->doThing1();
    x->doThing2();
    x->doThing3();
}

如果 var 不是变量但可以在编译时知道,则可以进行更激进的设计。在这种情况下,我将跳过 MyClass,但您会明白:

#include <type_traits>
#include <iostream>
#include <tuple>

struct A{void foo() {std::cout << "A" << std::endl;}};
struct B{void foo() {std::cout << "B" << std::endl;}};
struct C{void foo() {std::cout << "C" << std::endl;}};

template <int I>
struct SelectType
{
    typedef typename std::remove_reference<decltype(std::get<I-1> (std::make_tuple(A(), B(), C())))>::type type;
};

template <int I, class T = typename SelectType<I>::type>
T makeMyClassInstance() {return T();}

int main()
{
    auto x1 = makeMyClassInstance<2>();
    x1.foo(); 
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

减少C ++中的模板化类参数

来自分类Dev

减少C ++中的模板化类参数

来自分类Dev

在 C++ 中通过赋值初始化类后的“nullptr”

来自分类Dev

C ++中模板类的成员函数的专业化

来自分类Dev

模板化类中的typedef导致C ++错误

来自分类Dev

C ++中类成员的模板实例化

来自分类Dev

如何在C ++中对完整的类进行模板化

来自分类Dev

C ++元函数从模板化的基类中检索constexpr

来自分类Dev

C ++中模板化类型的类层次结构

来自分类Dev

在CNI / C ++代码中实例化模板类

来自分类Dev

永恒赋值运算符调用循环C ++模板类

来自分类Dev

C ++ 11模板类中模板类成员的初始化

来自分类Dev

模板中C ++继承中的模板类

来自分类Dev

类模板专业化,C ++,模板参数列表中的参数2不匹配

来自分类Dev

具有非模板化类的C ++类模板?

来自分类Dev

使用Clang LibTooling扫描已调用模板化父类中的本地类的C ++源

来自分类Dev

非模板类中的C ++模板函数

来自分类Dev

C ++:调用模板化类的非模板化函数

来自分类Dev

C ++-通过模板化类的模板专业化

来自分类Dev

C ++:模板化类指针转换

来自分类Dev

基础类的C ++模板专业化

来自分类Dev

C ++:从模板化的基类覆盖函数

来自分类Dev

c ++模板类,初始化()与{}

来自分类Dev

C ++类模板专业化

来自分类Dev

C ++类模板初始化问题

来自分类Dev

C ++模板类类型实例化

来自分类Dev

内部模板化类 C++

来自分类Dev

模板化类对象的 C++ 向量

来自分类Dev

类模板声明中的C ++嵌套类