我正在尝试为返回unique_ptr
实例的函数创建函数指针。每个函数都应该返回一个尽可能具体类型的值,以便对许多调用者普遍有用(在我的真实代码中,函数被命名为构造函数,并且在每个对象的公共标头中)。然而,在这个特定的用途中,我只关心每个类实现的通用接口。
我遇到了一个问题,我无法将返回的函数分配给返回unique_ptr<Subclass>
的函数指针unique_ptr<Superclass>
。
我把我的例子归结为这个片段:
#include <iostream>
#include <memory>
struct Foo {
virtual void foo() = 0;
};
struct Bar : public Foo {
void foo() {};
};
std::unique_ptr<Foo>
foo_creator()
{
return nullptr;
}
std::unique_ptr<Bar>
bar_creator()
{
return nullptr;
}
typedef std::unique_ptr<Foo>(*creator_fn)();
int
main(int argc, char *argv[])
{
std::unique_ptr<Foo> f;
f = foo_creator();
f = bar_creator();
creator_fn foo_fn = foo_creator;
creator_fn bar_fn = bar_creator; // Fails
return 0;
}
我从 clang ( Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
) 得到的编译错误是:
cannot initialize a variable of type 'creator_fn'
(aka 'std::unique_ptr<Foo> (*)()') with an lvalue
of type 'std::unique_ptr<Bar> ()':
different return type
('unique_ptr<struct Foo>' vs 'unique_ptr<struct Bar>')
我也愿意被告知实现目标的更好方法。:-)