仮に、double型やユーザー定義型を含む数値のような型で使用できる汎用ライブラリを開発したいとします。私が今直面している問題は、次のような関数テンプレートの戻り型を作成する方法がわからないことです。
template<class T>
auto transmogrify(T x)
-> ???
{
using std::abs;
return abs(x)+2.0;
}
using宣言を使用すると、プリミティブ型に対してこの関数テンプレートの本体が機能します。これは、プリミティブ型に名前空間が関連付けられていないためです(したがって、ADLはありません)。しかし、ユーザー定義型の作成者が独自のabs関数を提供する場合に備えて、transmogrifyで特殊なabs関数を使用したいと思います。単純に使えない
-> decltype( abs(x)+2.0 )
std :: absがスコープ内にないため、これはたとえばdoubleに対しては機能しないためです(私が知る限り)。しかし、書く
-> decltype( std::abs(x)+2.0 )
ADLを無効にします。ただし、ADLを無効にすることはできません。また、特殊なabs関数によって返される値は、タイプTではなく、他のタイプである可能性があります。
(a)ADLを維持し、(b)特殊なabsを提供しない型のデフォルト関数(この場合はstd :: absなど)にフォールバックしながら、戻り型の問題を解決する方法に関するアイデア。