Использование шаблонов функций вместо специализации шаблонов - PullRequest
0 голосов
/ 03 декабря 2018

Я специализируюсь на шаблонных функциях, когда доступны внутренние вычисления Intel.В моем случае SSE и AVX.Я хочу создать тестовую программу, в которой я называю неспециализированную функцию шаблона и специализированную функцию для сравнения производительности.Однако я не знаю, как вызывать неспециализированную функцию шаблона для типа, для которого она специализирована.

Вот упрощенный пример:

#include <iostream>

template <typename T>
void f(T val)
{
  std::cout << "Template function. Value: " << val << std::endl;
}

template <>
void f(float val)
{
  std::cout << "Float function. Value: " << val << std::endl;
}

int main()
{
  f(1);
  f(1.0f);
  return 0;
}

Вопрос: есть ли способ вызова f(1.0f) с неспециализированным шаблономфункция без изменения имен функций?

Пояснение: В моем случае две функции представлены в библиотеке как часть одной пары заголовка и файла реализации.Затем это включается (для шаблона) и связывается (для специализации) в программе.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Вариант № 2:

#include <iostream>

template <typename T>
void f(T val)
{
  std::cout << "generic" << val << std::endl;
}


void f(float val)
{
  std::cout << "Target specific" << val << std::endl;
}

int main()
{
  f(1); //=> generic
  f(1.0f); //=> target specific
  f<float>(1.0f); //=> generic
  return 0;
}
0 голосов
/ 03 декабря 2018

Вы можете добавить дополнительный параметр, чтобы запретить специализацию:

#include <iostream>

template <typename T, bool enable_specialization = true>
void f(T val)
{
  std::cout << "Template function. Value: " << val << std::endl;
}

template <>
void f<float, true>(float val)
{
  std::cout << "Float function. Value: " << val << std::endl;
}

int main()
{
  f(1.0f);
  f<float, false>(1.0f);
  return 0;
}

онлайн-компилятор

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