gpt4 book ai didi

c++ - 从模板参数的子类推断函数模板参数

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

我的问题类似于When a compiler can infer a template parameter? , 但有点复杂。

我想创建一个工厂函数,它推断出结果的类型,这样我就不必自己编写它,而是使用 auto 代替(如 auto b = ...或下面的 auto b3 = ...)。

我可以让代码使用普通指针,但是当我将它们更改为 unique_ptr 时,编译器会报错。

这是示例代码。

#include <iostream>
#include <memory>

template <typename T>
struct A {
T fA() const { return T(); }
};

struct Aint : A<int> {};

template <typename T>
struct B {
B(std::unique_ptr<A<T>> ptr) : ptr_(std::move(ptr)) {}
B(A<T>* ptr) : ptr_(ptr) {}
std::unique_ptr<A<T>> ptr_;
};

template <typename T>
std::unique_ptr<B<T>> CreateB(A<T>* a) {
return std::unique_ptr<B<T>>(new B<T>(a));
}

template <typename T>
std::unique_ptr<B<T>> CreateBFromUnique(std::unique_ptr<A<T>> a) {
return std::unique_ptr<B<T>>(new B<T>(std::move(a)));
}

int main() {
auto b = CreateB(new Aint);
std::cout << b->ptr_->fA() << "\n";

std::unique_ptr<Aint> a(new Aint);
// call below fails to compile
auto b2 = CreateBFromUnique(std::move(a));
// This works fine.
auto b3 = CreateBFromUnique<int>(std::move(a));
}

这里是 clangs 输出(g++ 打印类似的消息):

templates1.cpp:34:15: error: no matching function for call to 'CreateBFromUnique'
auto b2 = CreateBFromUnique(std::move(a));
^~~~~~~~~~~~~~~~~
templates1.cpp:24:23: note: candidate template ignored: could not match 'A<type-parameter-0-0>' against 'Aint'
std::unique_ptr<B<T>> CreateBFromUnique(std::unique_ptr<A<T>> a) {
^

如何创建在此处编译的工厂函数?

PS meta 请求:描述这个问题的规范方式是什么以便于谷歌搜索?

最佳答案

当然,方法不止一种,但是......

#include <memory>

template <typename T> T AtypeHelper(A<T>*){}
template <typename T>
using Atype = decltype(AtypeHelper((T*)0));

template <typename U, typename T = Atype<U>>
std::unique_ptr<B<T>> CreateBFromUnique(std::unique_ptr<U> a) {
return MakeUnique<B<T>>(std::move(a));
}

int main() {
auto b = CreateBFromUnique(MakeUnique<Aint>());
}

...您也可以考虑导出 typedef来自 A<T>制作T很容易提取为类似 typename U::value_type 的东西.

关于c++ - 从模板参数的子类推断函数模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32729420/

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