我正在尝试检测某些类型的运算符的存在。但是我无法区分__host__
和__device__
函数。我已经有一个用于识别普通C ++中的运算符的简单实现,但是无法区分__host__
和__device__
。
下面有一个最小的工作示例,该示例显示了对==
运算符的检测,但它同时为A
和B
打印了1。在做出区分方面的任何帮助将不胜感激。
#include <iostream>
using std::cout;
template<class X, class Y, class Op>
struct op_valid_impl
{
template<class U, class L, class R>
static auto test(int) -> decltype(std::declval<U>()(std::declval<L>(), std::declval<R>()),
void(), std::true_type());
template<class U, class L, class R>
static auto test(...) -> std::false_type;
using type = decltype(test<Op, X, Y>(0));
};
template<class X, class Y, class Op> using op_valid = typename op_valid_impl<X, Y, Op>::type;
template<class X, class Y> using has_equality = op_valid<X, Y, std::equal_to<>>;
class A {};
class B {};
class C {};
void __host__ operator==(A, A) {}
void __device__ operator==(B, B) {}
int main(int, char**) {
cout << "A: " << has_equality<A, A>::value << '\n';
cout << "B: " << has_equality<B, B>::value << '\n';
cout << "C: " << has_equality<C, C>::value << '\n';
return 0;
}
/* Output:
A: 1
B: 1
C: 0
*/
我使用GCC 7.3.1和CUDA 10进行了编译。