私は、機能の汎用バージョンfoo
を提供したいと思っています。これは、呼び出しに他の一致が全くない場合にのみ適用できます。 last_resort::foo
がderived::type
の場合、base::foo
より悪い一致となるように、次のコードを変更するにはどうすればよいですか?私はbar
の定義を変更することを伴わず、last_resort::foo
の引数の型を保持する解決策を見出したいと思います。ADL中に関数テンプレートの優先度を下げる方法は?
#include <iostream>
namespace last_resort
{
template<typename T> void foo(T)
{
std::cout << "last_resort::foo" << std::endl;
}
}
template<typename T> void bar(T)
{
using last_resort::foo;
foo(T());
}
namespace unrelated
{
struct type {};
}
namespace base
{
struct type {};
void foo(type)
{
std::cout << "base::foo" << std::endl;
}
}
namespace derived
{
struct type : base::type {};
}
int main()
{
bar(unrelated::type()); // calls last_resort::foo
bar(base::type()); // calls base::foo
bar(derived::type()); // should call base::foo, but calls last_resort::foo instead
return 0;
}
これは本当ですが、fooに「隠し」変換を導入する方法があるのでしょうか? –
私はそれが動作するとは思わない。あなたが得ることができる「最良の」と言うことから、コンパイルが失敗するようなあいまいさがあります。しかし、多分、私は何かが欠けている。 – sellibitze
解決策は、 '' 'last_resort :: foo'''の戻り値の型を、' '' disable_if_foo_exists :: type''のようなもので飾ることです。これはSFINAEを使ってフリーの '' foo ''関数。もし存在すれば、 '' last_resort :: foo'''はオーバーロードセットから削除されます。 –