gpt4 book ai didi

c++ - 嵌套类构造函数中的父模板参数推导

转载 作者:太空狗 更新时间:2023-10-29 21:10:29 25 4
gpt4 key购买 nike

我正在尝试编写可以推导父类模板的嵌套类的“提升”构造函数。它适用于父类,但不适用于嵌套类。这是一个代码示例。

template <class T>
struct potato {
struct baked {
template <class O>
baked(const typename potato<O>::baked& p)
: something(static_cast<T>(p.something)) {
}
baked() = default;

T something;
};

template <class O>
potato(const potato<O>& p)
: mybaked(p.mybaked) {
}
potato() = default;

baked mybaked;
};

int main(int, char**) {
potato<int> potato1;
potato<short> potato2(potato1);
}

这合法吗?

各种编译器输出各种错误。 Clang 是我心目中可读性最强的。它指出:

candidate template ignored: couldn't infer template argument 'O'

https://godbolt.org/z/y_IZiE

所以我猜我搞砸了签名,或者这不是 c++ 支持的功能。

最佳答案

我不知道有什么方法可以推导出模板参数 T对于 baked的 parent potato<T> .你可以知道T使用 decltype(p.something)但这似乎无助于解决调用构造函数的问题。一种解决方法是更改​​ baked的构造函数接受任何 O并假设它有一个 something :

struct baked {
template <class O>
baked(const O & p) : something(static_cast<T>(p.something))
{ }

baked() = default;

T something;
};

这会起作用,但它不如您的原始代码预期的类型安全。 那个 问题的一种解决方法是引入 static_assert检查 O实际上是一个 potato<U>::baked :

#include <type_traits>

template <class T>
struct potato {
struct baked {
template <class O>
baked(const O & p) : something(static_cast<T>(p.something))
{
using t_parent = potato<decltype(p.something)>;
static_assert(std::is_same<O, typename t_parent::baked>::value, "Not a baked potato!");
}

baked() = default;

T something;
};

template <class O>
potato(const potato<O>& p)
: mybaked(p.mybaked) {
}
potato() = default;

baked mybaked;
};

这应该可以很好地满足预期用途,但会因“Not a baked potato!”而失败。如果您尝试使用 something 传递任何其他内容.这会失败:

struct foo {
int something = 0;
};


int main(int, char**) {
foo bar;
potato<int>::baked baz(bar); // Error: Not a baked potato!
}

关于c++ - 嵌套类构造函数中的父模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54116309/

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