Я пытаюсь обнаружить существование операторов для некоторых типов.Но я не могу различить функции __host__
и __device__
.У меня уже есть простая реализация для идентификации оператора в обычном C ++, но она не может провести различие между __host__
и __device__
.
Ниже приведен минимальный рабочий пример, который показывает обнаружениеоператора ==
, но выводит 1 для A
и B
.Буду признателен за любую помощь в создании дистрибутива.
#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.