私の実際のユースケースはさらにいくつかの引数を取りますが、これは次のように単純化されます:
template< typename Arg1 >
bool algorithm( Arg1&& p1, **p2 here** );
それだけで、Arg1 が何らかの形で崩壊し、何らかの参照になる可能性が高いことは明らかです。p1 はアルゴリズムの出力でもあるため、呼び出し元が左辺値を渡すことを選択した場合、関数は中断した場所を反映するように変更された元のパラメーターで戻ります。
ただし、p2 は同じタイプですが、変更されることはありません。したがって、実際には、正確さのために「const」プロミスを入れたいと思います。明らかに、Arg1 が参照であると推測される場合、それに const を追加することはできません。
だから私の解決策はこれです:
template< class T >
struct make_const_ref
{
typedef typename std::add_reference< typename std::add_const< typename std::remove_reference< T >::type >::type >::type type;
};
template< typename Arg1 >
bool algorithm( Arg1&& p1, typename make_const_ref<Arg1>::type p2 );
これは、いくつかの修飾子を削除してから const& を元に戻すために、ばかげた策略の束を通過します。
だから私の質問は:
1) これが最善の方法ですか?
2) これが失敗するコンテキストはありますか? 今のところ、それは私にはかなり良いようです。