gpt4 book ai didi

c++ - 在模板特化中模拟开关组件

转载 作者:行者123 更新时间:2023-11-30 01:43:38 24 4
gpt4 key购买 nike

以下代码显示了我使用的设计。我做了一个包装器类,封装了一个模板类。包装器的一种方法允许使用开关来选择我想要的特化:

#include <memory>
#include <string>

/* Interface
*/
struct IFoo
{
virtual void lol(void) = 0;
};

/* Template Specialization
*/
template<std::size_t N>
class Foo : public IFoo
{
void lol(void) {}
};

/* Wrapper for the template
*/
class FooWrapper : public IFoo
{
std::unique_ptr<IFoo> mfoo;

public:
void setSize(std::size_t size)
{
switch (size) // how to 'simulate' this switch comportement
// with min/max constexpr variables ?
{
case 1u:
mfoo = std::make_unique< Foo<1u> >();
break ;
case 2u:
mfoo = std::make_unique< Foo<2u> >();
break ;
case 3u:
mfoo = std::make_unique< Foo<3u> >();
break ;
default:
throw std::runtime_error(std::to_string(size) + " not supported.");
}
}

FooWrapper(std::size_t size)
{
this->setSize(size);
}

void lol(void)
{
mfoo->lol();
}
};

int main(void)
{
FooWrapper a(3u); // ok
a.setSize(2u); // ok
a.setSize(0u); // will throw an exception at runtime

return EXIT_SUCCESS;
}

这是一种具有相同行为但使用最小和最大 constexpr 值以及在范围内循环并为每个值执行良好模板的开关的自动化版本的方法吗?

编辑:我正在寻找运行时解决方案,因为 setSize 的参数必须由用户通过 GUI 选择。

最佳答案

与所有模板元编程问题一样,不知何故 index_sequence参与。在这种情况下,在 index_sequence 中建立一个您为 Foo 上的模板参数接受的值并遍历它们。为简单起见,这是一个使用 0 的版本至少和 4作为最大值:

template <std::size_t... Is>
std::unique_ptr<IFoo> create(std::size_t N, std::index_sequence<Is...> ) {
std::unique_ptr<IFoo> mfoo;

using swallow = int[];
(void)swallow{0,
(void(N == Is ? mfoo = std::make_unique<Foo<Is>>() : mfoo), 0)...
};

return mfoo;
}

std::unique_ptr<IFoo> create(std::size_t N) {
return create(N, std::make_index_sequence<4>{} );
}

create(N)要么给你 Foo<N> (如果 0 <= N < 4 )或未设置 unique_ptr .如果它什么也没给你,你可以扔:

void setSize(std::size_t size) {
auto new_foo = create(size); // or call with index_sequence
if (!new_foo) {
// throw
}

mfoo = std::move(new_foo);
}

我将离开生成 index_sequence<1, 2, 3>作为练习。

关于c++ - 在模板特化中模拟开关组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37415812/

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