#c #c 17 #template-argument-deduction #function-templates
Вопрос:
есть ли способ неявно передать this
вызывающий класс вызываемой функции шаблона?
до сих пор я пробовал следующее:
template<class P, class T>
void funcA(Pamp; p, T const* t = this){ //<--does not work.
//...some code here...
}
class TypeX { }
class TypeA {
public:
void DoSomething(){
TypeX x;
funcA(x, this); //compiles fine
//funcA(x); //<---my goal: implicitly pass "this" by default.
}
}
void main(){
TypeA objX;
objX.DoSomething();
}
для решения этой type-of-"this"
проблемы у меня до сих пор работало следующее:
template<class T, class P>
constexpr auto funcA(Pamp; p) {
//...some code here that also uses type T...
}
class TypeA {
public:
void DoSomething(){
TypeX x;
funcA<TypeA>(x); //<---explicitly passing TypeA. (compiles)
//funcA(x); //<---my goal.
//funcA<>(x); //<---my goal(fair enough)
}
}
}
как вы можете видеть, я явно передаю TypeA
funcA
кому . по-моему, это лишнее. хотя в настоящее время он отлично работает в моем проекте, я попытался сделать его чище, сделав funcA<TypeA>(x)
funcA(x)
это . но пока безрезультатно. я надеюсь, что это все еще возможно сделать, поэтому я спросил здесь, в SO.
Комментарии:
1. создайте
funcA
функцию-член2. До тех пор, пока
funcA
это не функция-членTypeA
, это невозможно. Какую проблему предполагается решить? Зачем вам это нужно?3. В основном вы говорите: «Я хочу передать тип и
this
потому, что я хочу передать тип иthis
«. Должна быть основная причина, по которой вы хотите передать тип иthis
. Это делает этот вопрос проблемой XY . Всегда спрашивайте напрямую о основной проблеме, которую вы пытаетесь решить с помощью решения, в котором вам нужна помощь. Могут быть и другие решения, о которых вы еще не думали.4. Моя борода достаточно седая для
#define FUNCA(x) funcA(x, this)
.5. @Someprogrammerdude извините, если это расплывчато. я действительно решил конкретную проблему, которая у меня была. в настоящее время решения «явно» передают
this
илиdecltype(this)
. но мне любопытно, можно ли сделать это «неявным». это было бы лучше для меня, так как я могу избавиться от ключевых слов, которые, ИМО, «кажутся» избыточными. чем меньше параметров, тем лучше. я попробовал по-другому, а потом сдался и обратился к экспертам онлайн.
Ответ №1:
В комментарии вы сказали,
funcA
должен быть нечленом класса, особенно целевого класса, который он будет называться.
Учитывая это, невозможно использовать this
значение по умолчанию в качестве аргумента функции.
Я не вижу никаких проблем со следующим:
template<class P, class T>
void funcA(Pamp; p, T const* t){
//...some code here...
}
class TypeX { };
class TypeA {
public:
void DoSomething(){
TypeX x;
funcA(x, this); // Explicitly pass "this".
}
};
Это тоже не обременительно.
Комментарии:
1. да, это то, что я тоже сделал(на данный момент). я хочу знать, есть ли уже возможные способы получить «это» или его тип без явной передачи.
2. @acegs, ответ-однозначное «нет» неявной передаче
this
. Тип выводится из аргумента, используемого для выполнения вызова.