gpt4 book ai didi

使用 "invalid"模板参数的 C++ 元编程 - 允许吗?

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

在我使用元编程技术的一些代码中,我们使用模板化参数,这些参数被转发到其他地方并随后进行转换,因此我们实际上从未创建其中一些类的实例。

特别是,我们使用 std::vector<T>其中 T 没有包含在 vector 中的语义。实际上,尽管我们创建了一个 std::vector<shared_ptr<T> > .

代码看起来有点像这样:

class Bar : noncopyable
{
// whatever
};

class Foo : public FooInterface
{
public:
explicit Foo( std::vector< shared_ptr<Bar> > );
};

typedef Builder1Param< FooInterface, Foo, std::vector<Bar> > FooBuilder;

通过巧妙的元编程技术,FooBuilder 知道它会传入一个 vector<shared_ptr<Bar> >。至 Foo而不是 vector<Bar> .问题是因为 Bar 是不可复制的,所以它是 vector 的无效类型。

现在代码在我使用过的任何编译器上都可以正常编译,但我想知道它是否是有效的 C++(并且在 C++11 及更高版本中将继续如此)。

我可能应该补充一点,Bar 实际上可能是抽象的(而且通常会是)。目的是表明该参数是这些参数的集合(在某种意义上是 Java/C# 引用的风格)。

最佳答案

只要您不实例化类型,技术上就没问题,与例如不完整类型。

但是,这是一个糟糕的设计。

所有这些扭曲使得使用更多按键来编写误导性的东西成为可能,而不仅仅是传递参数。

我会重新考虑那个设计。

例如做

typedef Builder1Param< FooInterface, Foo, std::vector, Bar > FooBuilder;

对于模板定义部分,std::vector在这里是模板模板参数。

关于使用 "invalid"模板参数的 C++ 元编程 - 允许吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12423460/

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