Как избежать передачи параметра в экземпляр шаблона вспомогательного класса на основе ссылок - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть сторонний модуль, который предоставляет несколько экземпляров Object.Я хотел бы сделать некоторые дополнительные действия с объектами, однако у меня нет шансов создать производный класс.Вместо этого я создал оболочку, которая получает ссылку и реализует дополнительные вспомогательные функции.(см. класс Helper ниже.)

Есть ли способ избежать передачи параметра T в экземпляр шаблона, то есть использовать Helper(r) вместо Helper<const Object>(r)?


#include <iostream>
#include <functional>
using namespace std;

struct Object
{
    bool constOp() const { return false; }
    bool nonConstOp() { return true; }
};

template <class T>
struct Helper
{
    Helper(T &r) : m_ref(r) {}
    bool anotherConstOp() const { return m_ref.get().constOp(); }
    bool anotherNonConstOp() { return m_ref.get().nonConstOp(); }
private:
    reference_wrapper<T> m_ref;
};

int main() 
{
    {
        Object r;
        Helper<Object> h(r);
        cout << h.anotherConstOp() << endl;
        cout << h.anotherNonConstOp() << endl;
    }
    {
        const Object r;
        cout << Helper<const Object>(r).anotherConstOp() << endl;
        // doesn't compile nonconst - ok
        //cout << Helper<const Object>(r).anotherNonConstOp() << endl; 
    }

    return 0;
}

1 Ответ

0 голосов
/ 11 декабря 2018

В пространстве имен std вы найдете вспомогательные функции, такие как std::make_pair и std::make_optional для этой цели.Вы можете использовать

template<class T>
Helper<T> make_helper(T& object) {
  return Helper<T>(object);
}

, а затем

auto h = make_helper(r);

Я полагаю, у вас есть веская причина, почему вы хотите использовать эту оболочку Helper.В вашем примере нет необходимости.Вместо этого вы можете использовать бесплатную функцию:

bool anotherConstOp(const Object& object) {
  return object.constOp();
}

плюс перегрузки и / или универсальную версию:

template<class T>
bool anotherConstOp(const T& object) {
  return object.constOp();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...