我有一個問題,我想提供一個函數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'''將從超載集中移除。 –