Как я могу захватить прототип конструктора? - PullRequest
1 голос
/ 03 мая 2019

Я могу легко захватить и перечислить параметры метода или функции, используя шаблон с переменными значениями, например:

template<typename RT, typename ...Args>
class MyFunctor< RT (*)(Args ... args)>
{
    //Count the number of arguments
    static constexpr int const arity=sizeof ...(Args);

    //Create something to store the arguments in
    std::tuple<Args...> _arguments;

}

Затем я могу создать шаблонные методы, которые могут перебирать список аргументов и в конечном итоге вызывать указатель на реальную функцию, используя кортеж _agrument.

Я понимаю, что конструкторы безымянные, но они также без типов? Есть ли способ получить «тип» конструктора, чтобы я мог сделать нечто похожее на то, что я могу сделать с функциями и методами?

В C ++ 03 я мог захватить тип конструктора с помощью следующего (используя GCC 3.3):

TypeDefT< typeof( MyClass::MyClass(int i) ) *>

Поместив синтаксис указателя после оператора typeof (), я мог бы затем обработать сигнатуру конструктора как тип обычного указателя на функцию.

Затем я бы добавил метод create в шаблон FunctionPointer, который затем мог бы вызываться с простым списком параметров, и мог бы появиться новый MyClass (p1, p2, p3).

Тем не менее, кажется, что в C ++ 17 нет способа получить тип конструктора, как я мог бы в C ++ 03 или в функциях в C ++ 17. Есть ли способ сделать это?

Спасибо

1 Ответ

1 голос
/ 03 мая 2019

Конструкторы не имеют типов. Вы заметили, что вам не разрешено писать тип возвращаемого значения при объявлении конструктора?

К сожалению, нет способа получить что-то вроде указателя функции на конструктор. Ваше решение "C ++ 03" не является стандартным, а GCC 3.3 - это очень старый компилятор; В те времена у GCC было много непереносимых расширений, и большинство из них было удалено.

Вам нужно найти другой способ сделать то, что вы хотите сделать. Как указано в комментариях к вопросу, универсальному коду обычно не нужно «знать» подпись конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...