時會被調用,其被重載用於用戶定義類型X
如下自由函數foo
(C
作爲一個庫類型的主叫foo
):確定我使用的過載傳遞類型作爲參考
template <typename C>
void foo(C&, const X&) {...}
我能夠確定在編譯時是否存在用於特定類型X
過載:
template <typename... Args>
auto foo_exists(int) -> decltype(std::bind<void(*)(Args...)>(&foo, std::declval<Args>()...), std::true_type());
template <typename... Args>
auto foo_exists(char) -> std::false_type;
struct Caller
{
template <typename T>
void call(const T& x)
{
static_assert(decltype(foo_exists<decltype(*this), const T&>(0))::value, "");
}
};
現在假設下面的類層次結構與foo
個重載Base
和Derived
:
struct Base{};
struct Derived : Base {};
struct Leaf : Derived{};
template <typename C>
void foo(C&, const Base&) { std::cout << "Base" << std::endl; }
template <typename C>
void foo(C&, const Derived&) { std::cout << "Derived" << std::endl; }
我如何能夠確定調用foo(..., Leaf())
時,該const Derived&
超載將被調用?
一般地講:
我想,以找出是否一個函數重載爲特定類型的X
測試所需的確切類型的foo
。存在;如果它不存在,我想知道是否存在基類型爲X
的其他函數重載,如果存在,則在將類型爲const X&
的參數傳遞給它時調用哪個函數。
「哪些」信息應包含基本類型,對於上述示例應爲Derived
(而不是Base
)。
@ildjarn我讀了另外一個問題,但是我想也許我對基類重載的限制會啓用我需要的東西 –
最基本的限制是缺少編譯時反編譯的重載集;用作參數的類型沒有軸承AFAICT。 – ildjarn