【发布时间】:2018-10-21 11:42:17
【问题描述】:
完整示例请参见编译器资源管理器:https://godbolt.org/z/_rVFvO
给定一个抽象模板类Runnable 和一个继承自Runnable<int> 的实现Derived:
#include <iostream>
#include <memory>
using namespace std;
template<class... Args>
struct Runnable
{
virtual ~Runnable() = default;
virtual void f(Args... args) const = 0;
};
struct Derived : public Runnable<int>
{
void f(int x) const override
{
cout << "f(" << x << ")" << endl;
}
};
给定派生类型的智能指针,函数accept_variadic 的模板参数推导失败的根本原因是什么?
template<class... Args>
void accept_variadic(std::unique_ptr<Runnable<Args...>> o, Args&&... args)
{
o->f(forward<Args>(args)...);
}
int main()
{
accept_variadic(make_unique<Derived>(), 5); // Error (no conversion)
return 0;
}
但是直接给定一个引用(或指针)而不使用智能指针:
template<class... Args>
void accept_variadic_ref(const Runnable<Args...>& o, Args&&... args)
{
o.f(forward<Args>(args)...);
}
int main()
{
accept_variadic_ref(Derived(), 5); // OK
return 0;
}
另外,有没有办法通过模板类推导指南或使用不同的智能指针来支持类似的用法(在我的应用程序中拥有原始指针和非生命周期扩展引用会很困难)。
【问题讨论】:
标签: c++ templates polymorphism