从模板实参的子类中推断函数模板形参
Infer function template parameter from a subclass of a template argument
我的问题类似于编译器何时可以推断模板参数?,但更复杂一点。
我想创建一个工厂函数,它可以推断其结果的类型,这样我就不必自己写了,而是使用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元请求:什么是规范的方式来描述这个问题,以便谷歌容易?
当然有不止一种方法,但是…
#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>());
}
…您还可以考虑从A<T>
导出typedef
,使T
易于提取为类似typename U::value_type
的内容。
相关文章:
- 通过类的模板形参特化成员模板结构
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 哪种方法更适合为函数提供编译时间常数?函数实参与模板形参
- 如何在构造函数中指定不可推导的模板形参
- 从模板实参的子类中推断函数模板形参
- 函数指针的vector:不同的模板形参
- 接受std::函数的模板函数,该函数依赖于模板形参
- 通过函数实参而不是模板形参获取元组的元素
- 具有指针引用模板形参的c++模板成员函数
- c++使用constexpr函数的形参作为模板的常量
- 在模板演绎中保持函数指针形参的完整类型
- 为什么这样调用构造函数时模板形参推导失败?
- 在函数实参中使用模板形参不适用gcc4.8
- 调用模板形参的成员函数的Result_of
- 在c++中对模板形参调用静态函数
- 启用基于类模板形参的构造函数时,是否总是需要复制该类模板形参?
- 从c++ 17开始,构造函数的模板形参推导是否允许显式指定一些类模板实参?
- 使用可变模板形参的构造函数和函数
- 从构造函数中的成员变量推导出模板形参