考慮到一個類Bar在一個庫的兩個版本中:
//v1
class Bar
{
void get_drink()
{
std::cout << "non-const get_drink() called" << std::endl;
}
};
// v2
class Bar
{
void get_drink()
{
std::cout << "non-const get_drink() called" << std::endl;
}
void get_drink() const
{
std::cout << "const get_drink() called" << std::endl;
}
};
在客戶端代碼中,我們擁有一個Bar物件,并希望get_drink。我希望能夠優先呼叫get_drink()的常量版本,如果它是可用的(當使用v2庫時),并退回到非常量版本(當使用v1庫時)。這就是:
Bar bar。
bar.get_drink(); //這并沒有呼叫v2的const版本。
static_cast<const Bar&>(bar).get_drink(); //this does not compile against v1 library。
不幸的是,該庫沒有版本劃分,也沒有其他方法來區分這兩個版本。
我認為必須要使用一些模板魔法。那么問題來了,怎么做呢?
uj5u.com熱心網友回復:
這似乎是可行的:
這似乎是可行的。
#include <type_traits>
#include <iostream>
template<typename T, typename=void>
struct find_a_drink {
void operator()(T &t) const
{
t.get_drink()。
}
};
template<typename T>
struct find_a_drink<T。
std::void_t<decltype( std::declval<constT &>( )
.get_drink())>
> {
void operator()(T &t) const
{
static_cast<const T &>(t).get_drink() 。
}
};
template<typename T>
void drink_from(T &&t)
{
find_a_drink<std::remove_reference_t<T>>{}(t)。
}
// v1
class Bar1
{
public:
void get_drink()
{
std::cout << "non-const get_drink() called (Bar1)" << std::endl;
}
};
class Bar2
{
public:
void get_drink()
{
std::cout << "非const get_drink() called (Bar2)" << std::endl;
}
void get_drink() const
{
std::cout << "const get_drink() called (Bar2)" << std::endl;
}
};
int main()
{
Bar1 b1。
Bar2 b2;
drink_from(b1)。
drink_from(b2)。
return 0;
結果:
non-const get_drink() called (Bar1)
const get_drink()被呼叫 (Bar2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321862.html
標籤:
