如何实现一个工厂有多个交换机?

2023-11-21

我想实现一个工厂函数来创建对象。我的对象模板如下所示:

template <typename TA, typename TB>
struct MyImpl : public MyInterface
{
    // content
};

我的工厂是这样的:

MyInterface* factory(char ta, char tb)
{
    if(ta == 'c' && tb == 'c')
    {
        return new MyImpl<char, char>();
    }
    if(ta == 'c' && tb == 's')
    {
        return new MyImpl<char, short>();
    }
    if(ta == 's' && tb == 'c')
    {
        return new MyImpl<short, char>();
    }
    // and so on ....
}

工厂函数必须接受非静态字符数据(ta, tb)因为它无法在编译时确定,我认为这就是这个工厂的全部意义。实际上,ta and tb从文件(或网络)中读取。

我想要一个更简单的解决方案来避免烦人的两级切换。

我认为我的问题类似于如何在 C 中编写元 if-else-if-in-c但我不能使用静态参数。

也许我应该回退到 C 宏并使用一些宏技巧来缩小我当前的代码?

提前致谢!

UPDATE

回复@Rob:

我的实际代码会更复杂,其中包含许多其他内容,并且更难以阅读,并且在许多方面都不相关。我正在尝试正确获取伪代码,如果有任何问题,请通知我:-)。

回复@Dynguss:

我的问题是,在我的实际实现中,工厂的参数(ta,tb)范围会很大,比如10 X ta和20 X tb,并且ta和tb的组合会很长,并且很难维护。所以我至少需要某种方法来减轻组合工作的难度。


这是一个想法:

template <typename T>
MyInterface * factroy(char t)
{
    if (t == 'c') { return MyImpl<T, char>();  }
    if (t == 's') { return MyImpl<T, short>(); }
    // ...
}

MyInterface * factory(char ta, char tb)
{
    if (ta == 'c') { return factroy<char>(tb);  }
    if (ta == 's') { return factroy<short>(tb); }
    // ...
}

使用可变参数模板,此模式可以扩展到任意数量的类型参数 - 例如:

struct Base { virtual ~Base() = default; };
template <typename A, typename B, typename C> struct Foo : Base { };

#include <tuple>

template <typename ...Args>
constexpr Base * factory(std::tuple<Args...>)
{
    return new Foo<Args...>;
}

template <typename ...Args, typename ...Char>
constexpr Base * factory(std::tuple<Args...>, char t, Char ... ts)
{
    return t == 'c' ? make(std::tuple<char,      Args...>(), ts...)
         : t == 's' ? make(std::tuple<short int, Args...>(), ts...)
         : t == 'i' ? make(std::tuple<int,       Args...>(), ts...)
         : t == 'l' ? make(std::tuple<long int,  Args...>(), ts...)
         : nullptr;
}

Usage: auto p = factory(std::tuple<>(), 'c', 's', 'l');

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何实现一个工厂有多个交换机? 的相关文章

随机推荐