Разрешение области действия для статической функции или указателя в классе шаблона

В настоящее время я работаю над кодом, который написал кто-то другой, и я не уверен в эффективности их метода. У них есть класс-шаблон, который использует разрешение области для доступа к членам класса вместо указателя на класс-шаблон и доступа к нему таким образом. Например:

template <typename T>
class A {
    void func() {
        T::DoSomething();
    }
};

class B {
    static void DoSomething() {
        // code...
    }
};

Я лично считаю, что это затрудняет понимание класса шаблона, но моя основная область запроса — производительность. Что более эффективно; используя разрешение области или имея закрытую переменную-член A::T* p_blah и вызывая функцию B с помощью p_blah->DoSomething()?


person Edward    schedule 11.12.2013    source источник


Ответы (1)


Разрешение области видимости — это то, что происходит исключительно во время компиляции. Метод, используемый в этом коде, приводит к прямому встроенному вызову функции. Вы не можете победить это.

Ваше \ твое предложение:

  • Требуется, чтобы экземпляр B был каким-то образом создан
  • Требуется, чтобы указатель на этот экземпляр хранился либо в A (увеличивая его размер), либо в глобальном (всегда проблематично)
  • Вводит необходимость отслеживать время жизни этого экземпляра.

Короче говоря, у него мало шансов быть столь же эффективным, как у вас сейчас.

person Mat    schedule 11.12.2013
comment
Я так и думал. Итак, нет ли недостатков в использовании метода статических функций? (Предполагая, что класс не имеет переменных-членов) - person Edward; 11.12.2013
comment
Если под методом статических функций вы подразумеваете вызов B::foo(), то нет. Ваш аргумент о том, что это затрудняет понимание класса, на самом деле не имеет смысла. Если вместо этого поставить ptr->foo(), когда он предназначен для статического вызова, это запутает шаблон. - person Mat; 11.12.2013