std::make_shared
は、バリデーション機能テンプレートである。 <foo>
をテンプレートパラメータとして指定するだけですが、int
も必要です。それにもかかわらず、あなたのアプローチは、make_shared
のテンプレート引数がどのようにレイアウトされているか、そしてC++のオーバーロードセットを扱うのが一般的に面倒なので、失敗する可能性があります。書き込み、読み出し、及び理解することは簡単です私の意見では
constexpr auto newfoo(int x)
{
return std::make_shared<foo>(x);
}
:私が提案する何
ではなく、ラッパー関数を作成することです。あなた本当にがSFINAE、親しみやすさとnoexcept
が必要な場合は、repeat the body three timesことができます。
constexpr auto newfoo(int x)
-> decltype(std::make_shared<foo>(x))
noexcept(noexcept(std::make_shared<foo>(x)))
{ return std::make_shared<foo>(x); }
マクロは上記の宣言は、苦痛が少ないために使用することができます。
あなたが本当に関数ポインタをしたい場合は、これが動作しているようです:make_shared
の宣言で
auto newfoo =
static_cast<std::shared_ptr<foo>(*)(const int&)>(
&std::make_shared<foo, const int&>);
ルック:
template< class T, class... Args >
shared_ptr<T> make_shared(Args&&... args);
あなたはArgs...
ためT=foo
と何かを提供する必要があります。 Args...
は転送参照パックであるため、左値参照またはの値の参照に常に推算されます。このため、<foo, const int&>
はテンプレートパラメータの有効なセットであり、<foo, int>
は有効ではありません。
constexpr auto newfoo = &std::make_shared<foo, const int&>;
キャストが本当にここに必要とされていません:コメントで指摘
Zefickとして、このすべてはに単純化することができます。
+1ですが、 "本当にしたい場合"の例では 'int &&'の代わりに 'const int&'を使うべきでしょう。つまり、 'const int i = 42; auto f = newfoo(i); 'は動作しません。 –
@MilesBudnek:良い点、私の答えを変更しました –
'constexpr auto newfoo = std :: make_shared'が動作します。なぜキャストが必要なの? –
Zefick