gpt4 book ai didi

c++ - 如何实现具有多个开关的工厂?

转载 作者:可可西里 更新时间:2023-11-01 18:20:42 26 4
gpt4 key购买 nike

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

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 ....
}

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

我想要一个更简单的解决方案来避免恼人的 2 级开关。

我认为我的问题类似于 how-would-one-write-a-meta-if-else-if-in-c除了我不能使用静态参数。

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

提前致谢!

更新

对@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;
}

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

关于c++ - 如何实现具有多个开关的工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12566271/

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