Как вызвать функцию шаблона другим способом? - PullRequest
0 голосов
/ 17 июня 2020

Этот вопрос в основном касается подхода к дизайну, и я хотел бы знать, как решать такие проблемы в современном языке C ++.

У меня есть библиотечная функция, которая определена как (это настоящая код из компилятора):

template <info::device param>
typename info::param_traits<info::device, param>::return_type
get_info() const;

Чтобы вызвать эту функцию, я мог бы написать что-то вроде:

some_device.get_info<cl::sycl::info::device::device_type>()

, где cl::sycl::info::device::device_type - фактический параметр.

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

В этот момент я мог бы сделать что-то вроде:

some_device.get_info<cl::sycl::info::device::param1>()
some_device.get_info<cl::sycl::info::device::param2>()
...
some_device.get_info<cl::sycl::info::device::paramN>()

но поскольку это ужасно, я ищу лучшее решение на C ++ 11/14.

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Для выражений свертки явное l oop (или рекурсия) не требуется. Например:

#include <iostream>
#include <string>

template <typename T>
void foo(){ std::cout << T{}; }   // just an example

template <typename...Args>
void bar() {
    (foo<Args>(),...);            // call foo for each type in Args
}

int main() {
    bar<int,double,std::string>();
}

Чтобы иметь «коллекцию» поддерживаемых типов, вы можете использовать using collection = std::tuple<int,double,std::string>;.

0 голосов
/ 01 июля 2020

Для всего этого типа кода я использую Boost.Hana, перебирая кортежи с boost::hana::for_each, либо с точки зрения пользователя, но и для внутренней реализации SYCL.

...