Неявно передайте «это» ИЛИ «тип» вызывающего класса функции шаблона, не являющейся членом

#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 . Тип выводится из аргумента, используемого для выполнения вызова.