Ссылаясь на шаблонную функцию в шаблоне

Я хотел бы иметь возможность назвать шаблонной функции в шаблоне.

Поскольку можно назвать шаблонный класс с использованием синтаксиса "шаблон шаблона", а поскольку можно назвать функцию с использованием синтаксиса "указатель функции", мне было интересно, существует ли синтаксис (или предложение) для именования функции в шаблоне без указания шаблонов.

template<typename t_type>
struct A {
  t_type value;
};

template<template<typename> class t_type>
struct B {
  t_type<int> value;
};

template<int added>
constexpr int C (int value) {
  return value + added;
}

template<int (*function)(int)>
constexpr int D (int value) {
  return function(value);
}

// GOAL: Template argument referring to templated function
/*template<template<int> int (*function)(int)>
constexpr int E (int value) {
  return function<1>(value);
}*/

int main() {
  B<A> tt_good;
  int fp_good = D< &C<1> >(0);
  /*int fp_fail = E< &C >(0);*/

  return 0;
}

Один из возможных обходных путей для всех, кто интересуется этой функцией, - сначала обернуть функцию D в структуру с помощью метода вызова с именем (например) "method", передать структуру в E как параметр "template template", а затем вызвать " метод "в Э.

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

1 ответ

К сожалению, вы не можете передавать шаблоны функций в качестве параметров шаблона. Самое близкое, что вы можете получить, это использовать универсальные функторы:

#include <iostream>

template <typename F>
void call(F f)
{
    f("hello, world\n");
}

int main()
{
    call([](auto value) { std::cout << value; });
}

Если у вас нет общих лямбд в C++14, вы можете написать свои собственные функторы вручную:

#include <iostream>

template <typename F>
void call(F f)
{
    f("hello, world\n");
}

struct print
{
    template <typename T>
    void operator()(T value) const
    {
        std::cout << value;
    }
};

int main()
{
    call(print());
}
Другие вопросы по тегам