Нетипичный аргумент шаблона для разрешения различных типов функций? - PullRequest
0 голосов
/ 29 мая 2018

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

template <class R, R func() >
auto Call() -> R
{
   return func();
}

int f() { return 1; }

int main()
{
    Call<int, f>();      // OK

    Call<f>();           // Error
}

Есть ли способ сделать это вызываемым без необходимости повторения возврата функциитипа, как в Call<f>()?

Это может быть сделано через препроцессор, #define CALL(f) Call<decltype(f()), f>, но я хотел бы знать, если это можно сделать без препроцессора.

1 Ответ

0 голосов
/ 29 мая 2018

Это то, для чего были разработаны параметры шаблона auto (C ++ 17 и более поздние версии).

#include <cstdio>
#include <type_traits>

template <auto Fn>
auto Call() -> decltype(Fn()) {
    return Fn();
}

int f() { return 1; }

int main() {
    printf("%d\n", Call<f>());
}

http://coliru.stacked -crooked.com / a / 55808ba25f0a07cd

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