Не совсем, пока C ++ не получит отражение, мы не сможем легко написать классы-обертки без большого количества шаблонных макросов
, но
Вы можете добавить неявное преобразование ваш класс-обёртка T
:
template<class T>
class Wrapper{
public:
Wrapper(T data_) : data(data_) {}
operator const T&() const
{
return data;
}
private:
T data;
};
А теперь ваш класс можно преобразовать в T
, поэтому мы можем вызвать метод на T
с небольшой работой:
использование:
struct Foo
{
constexpr int bar() const
{
return 42;
}
};
int main()
{
constexpr Foo f;
Wrapper<Foo> my_wrapper(f);
static_assert(static_cast<const Foo&>(my_wrapper).bar() == 42);
}
Если вы хотите избежать кастинга самостоятельно, вы можете написать бесплатную функцию, которая будет вызывать вашу функцию, так что неявное преобразование может занять:
int call_bar(const Foo& f)
{
return f.bar();
}
Использование:
Foo f;
Wrapper<Foo> my_wrapper(f);
std::cout << call_bar(my_wrapper); // 42
Мне нравится этот подход, так как все, что требуется, это что мы добавляем бесплатную функцию для каждой обернутой функции, которую мы хотим, вместо того, чтобы вручную выполнять кучу приведения.