2016-06-11 8 views
0

У меня есть следующий класс:Что такое «использование» в этом случае и что хранится?

class Foo{ 

} 

class Bar{ 
public: 

    using meth = Foo* (*)(int a, std::string b); 
} 

Может кто-то объяснить, что означает, что линия:

 using meth = Foo* (*)(int a, std::string b); 

Мне кажется, что это способ хранения указателя на конструктор или что-то. Если кто-то может объяснить, я был бы признателен.

Пожалуйста, не стесняйтесь редактировать сам вопрос, чтобы сделать его более наглядным - если бы я знал, что сделал этот код, я бы не стал задавать вопрос.

ответ

4

Линия

using meth = Foo* (*)(int a, std::string b); 

meth делает стенографию (тип псевдоним) для объявления длительной функции типа указатель.

Он может быть использован как:

Foo* bar(int a, std::string b); 

meth baz = bar; 
+1

Но Foo пуст и не содержит никаких функций. Итак, что хранится?Кроме того, я не понимаю, что делает ваш второй блок кода. Он выглядит как объявление функции в первой строке, а затем вы назначаете его методу. Я не знаю, что с этим делать, и не понимаю, почему вы это сделаете. –

+0

Это функция-указатель для глобальной функции. 'Foo *' - это только возвращаемый тип. –

+0

Итак, вы говорите, что (*) обозначает функцию, (int a, std :: string b), параметры и Foo * тип возврата? –

4

В этой ситуации это просто новая форма создания типа-псевдонима, как и использование typedef. В нем говорится, что тип-псевдоним meth является указателем на функцию, принимающую int и аргумент std::string и возвращающий указатель на Foo. Затем вы можете использовать его, чтобы объявить переменные, например, например.

meth walter; 

Вы можете присвоить переменной walter, как и любой другой переменной.

Тип-псевдоним хранится в памяти для компилятора, он не записывается в объект или исполняемый файл, он просто используется компилятором и внутри него.


Следует отметить, что, как и многие другие вещи в C++ контекст имеет важное значение, и что ключевое слово using может делать разные вещи в разных контекстах.

Его можно использовать для создания псевдонимов типов (как в вопросе), его можно использовать для создания псевдонимов пространства имен, его можно использовать для вытягивания символов из одной области видимости в другую область (наиболее распространенное из них, к сожалению), чтобы вытащить все символы из пространства имен std в глобальную область).

+0

Саул никогда не денатурат в любом случае. Может ли это использоваться для указания на конструкторы? –

+0

@John Конструкторы или деструкторы не могут использоваться в качестве указателей функций, это специальные методы. –

+0

@John Нет, он не может использоваться для указания на нестационарную функцию-член, только функции, не являющиеся членами, или функции-члены 'static'. Если вам нужен указатель на нестационарную функцию-член, вам нужно, например, 'void (Foo :: *) (...)'. Скорее это теперь функция, которая может создавать (и возвращать) экземпляр 'Foo'. –