У меня есть несколько вопросов, касающихся шаблонов функций.
Мой план состоял в том, чтобы создать оболочку, которая является производной от определенного пользователем класса и
не только экспортирует публичные функции этого класса, но и его конструкторы.
Поэтому я решил, что буду использовать несколько шаблонов конструктора (которые, я полагаю, работают точно
аналогично шаблонам функций) с параметрами от 1 до n для удовлетворения большинства потребностей конструкторов.
Они бы просто вызывали конструктор и потом делали что-то еще, например
это:
template <class T>
class Wrapper : public T
{
public:
template <class U>
Wrapper(U &u) : T(u) { doSomething(); }
template <class U, class V>
Wrapper(U &u, V &v) : T(u,v) { doSomething(); }
...
};
Мое намерение состоит в том, чтобы зарегистрировать экземпляр в Wrapper-Ctor где-нибудь еще, и,
с этого момента он может принимать вызовы виртуальных функций, определенных в T.
Мне пришлось использовать оператор ссылки в приведенном выше коде, чтобы гарантировать, что
мой Wrapper-Ctor не имеет побочных эффектов на параметры, которые были переданы
(Копия-строительство).
К моему удивлению, это всегда работало, за исключением временных, что является причиной, почему
Я запутался в типах, которые выводятся компилятором в этой ситуации.
Чтобы упростить ситуацию, я попытался сделать что-то похожее с помощью функции шаблона:
template <class T>
void foo(T &t)
{
int x = ""; // intentional error
}
Вызов функции следующим образом:
std::string a;
std::string &b = a;
foo(b);
К моему удивлению, компилятор отмечает [T = std :: string] в своем сообщении об ошибке.
Я ожидал, что это будет [T = std :: string &], что вызвало бы
передача ссылки на ссылку, что недопустимо.
Итак, почему компилятор выводит тип значения в этой ситуации?
Возможно ли даже создать Wrapper-Ctor, который делает то, что я хочу, не
Есть побочные эффекты на параметры, а также принимает временные эффекты?
Большое спасибо!