Сопоставление аргументов шаблона одного шаблона функции с аргументами шаблона другого (c ++) - PullRequest
0 голосов
/ 03 июня 2018

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

В приведенном ниже коде я вызываю foo<1,2>(), это генерирует функцию, а внутри тела этой функции она вызывает сгенерированную bar<2>() функцию.Проблема для меня в том, что у меня есть сложная функция, которая, насколько я знаю, не может быть оценена с помощью стандартных арифметических операторов.

Я могу использовать c ++ 11, если это поможет.

#include <iostream>

template<size_t c>
unsigned int bar(){
    return c;
}

template<size_t a, size_t b>
unsigned int foo(){
    return bar<a*b>();
    //return bar<COMPLICATEDFUNCTION(a,b)>();   // what I actually want to do
}

int main(void) {

    std::cout << foo<1,2>();
    return 0;
}

Если это поможет, моя конкретная функция: f (r, c) = r * c - c - (cвыберите 2), который подсчитывает количество элементов с меньшей диагональю неквадратной матрицы (r> c).Функция, которую я написал для вычисления этого, может быть объявлена ​​inline, но, насколько я понимаю, компилятор не обещает этого.В предыдущем вопросе я спрашивал об использовании макрофункций, и это было встречено со скептицизмом.Кроме того, в том же потоке были предложены функции constexpr.

1 Ответ

0 голосов
/ 03 июня 2018

Конечно, constexpr - ваш спаситель.Используя следующие определения:

constexpr size_t fact(size_t x) {
  return (x == 0 || x == 1) ? 1 : x * fact(x - 1);
}

constexpr size_t choose(size_t n, size_t k) {
  return fact(n) / (fact(k) * fact(n - k));
}

constexpr size_t complexfunc(size_t r, size_t c) {
  return r * c - c - choose(c, 2);
}

вызов bar<complexfunc(a,b)>(); должен просто работать, предполагая C ++ 11.

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