0

这个问题主要是关于设计方法的,我想知道如何用现代 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 中寻找更好的解决方案。

4

2 回答 2

1

使用折叠表达式不需要显式循环(或递归)。例如:

#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>;.

于 2020-06-17T10:06:17.357 回答
0

对于所有这类代码,我使用 Boost.Hana 对带有 的元组进行迭代boost::hana::for_each,无论是从用户的角度来看,还是用于 SYCL 内部实现。

于 2020-07-01T02:15:04.797 回答