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>')
私は、自分の目標を達成するためのより良い方法について言われることにもオープンです。:-)