CUDA 内核"Only a single pack parameter is allowed"解决方法?
CUDA kernel "Only a single pack parameter is allowed" workaround?
关于可变参数全局函数模板的 CUDA 7 标准规定"只允许单个包参数"。 有没有一个优雅的解决方法? 我希望能够执行以下操作:
template<int... vals>
void RecursiveFunct() {
}
template<int... vals, typename T, typename... Args>
void RecursiveFunct(T t, Args... args) {
t.template call<vals...>();
RecursiveFunct<vals...>(args...);
}
我想我可以在传递它们之前将我的整数包包装成一些东西,但是是否可以以对此代码的调用者透明的方式执行此操作?
不确定是否了解您的确切限制,但是...我想std::integer_sequence
和调用call()
的包装函数可以帮助您。
下面是一个玩具,但可编译的示例,显示了我的意思。
struct foo
{
template <int ... vals>
void call () const
{ std::cout << "- call " << sizeof...(vals) << std::endl; }
};
template <typename IS>
void RecursiveFunct (IS const &)
{ }
template <typename T, int ... vals>
void wrapCall (T const & t, std::integer_sequence<int, vals...> const &)
{ t.template call<vals...>(); }
template<typename IS, typename T, typename ... Args>
void RecursiveFunct (IS const & is, T t, Args... args)
{
wrapCall(t, is);
RecursiveFunct(is, args...);
}
int main ()
{
// print 5 times "- call 4"
RecursiveFunct(std::integer_sequence<int, 2, 3, 5, 7>{},
foo{}, foo{}, foo{}, foo{}, foo{});
}
考虑到std::integer_sequence
是 C++14 功能,因此前面的代码(至少(需要一个 C++14 编译器。
但是,如果您需要使用 C++11,创建一个std::integer_sequence
替代品是微不足道的。
通过示例
template <typename T, T ... ts>
struct myIntegerSequence
{ };
--编辑--
OP问
这可以在不创建integer_sequence实例的情况下工作吗?
在正常的 C++14 中,是的。与库达一起工作吗?我不知道。
我已经获得了使用wrapCall
结构和func()
静态方法更改wrapCall()
函数的方法。这是因为我使用了不能与 func 一起使用的部分专用化。
福林是玩具的例子
#include <utility>
#include <iostream>
struct foo
{
template <int ... vals>
void call () const
{ std::cout << "- call " << sizeof...(vals) << std::endl; }
};
template <typename>
void RecursiveFunct ()
{ }
template <typename>
struct wrapCall;
template <int ... vals>
struct wrapCall<std::integer_sequence<int, vals...>>
{
template <typename T>
static constexpr void func (T const & t)
{ t.template call<vals...>(); }
};
template<typename IS, typename T, typename ... Args>
void RecursiveFunct (T t, Args... args)
{
wrapCall<IS>::func(t);
RecursiveFunct<IS>(args...);
}
int main ()
{
// print 5 times "- call 4"
RecursiveFunct<std::integer_sequence<int, 2, 3, 5, 7>>
(foo{}, foo{}, foo{}, foo{}, foo{});
}
但是你确定这是一个std::integer_sequence
的问题吗?
相关文章:
- Why is UINT32_MAX + 1 = 0?
- C++错误:"error: int aaa::bbb is protected within this context"
- 创建具有 new in 函数和"this is nullptr"异常的对象
- reference_wrapper导致"incomplete type is not allowed"
- 结构中的错误"Incomplete type is not allowed"
- 函数模板(它是类模板的成员)的显式专用化会产生"partial specialization is not allowed"错误,为什么?
- CUDA 内核"Only a single pack parameter is allowed"解决方法?
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- 浮子阵列抛出"incomplete type is not allowed"
- 类 C++ 错误:"Virtual is not allowed"
- 在编辑器中"Error: type name is not allowed"消息,但不在编译期间
- 为什么海湾合作委员会说"a function-definition is not allowed here before '{' token"?
- 为什么我使用这些意大利面模板会"error: type name is not allowed"?
- 错误:移植项目时"incomplete type is not allowed"
- C++结构"Incomplete type is not allowed"
- 在VS2013中使用NVCC编译时出现"modifier is not allowed on a destructor"错误
- 需要帮助: "IntelliSense: data member initializer is not allowed"
- " a namespace name is not allowed" javacpp 中的错误
- "Incomplete Type Is Not Allowed"错误
- 英特尔C++编译器 (ICPC 14.0): "a derived class is not allowed here"