Visual c++ C+上的专门模板+;限安培兰博达斯

Visual c++ C+上的专门模板+;限安培兰博达斯,visual-c++,lambda,template-specialization,c++-amp,restrict-qualifier,Visual C++,Lambda,Template Specialization,C++ Amp,Restrict Qualifier,利用(和其他一些人)的见解,我已经能够编写以下内容来询问正常的lambda函数类型信息(即返回类型、参数计数等) 很明显,模板专业化没有得到重视。然而,加入新的专业化 template <typename R, typename F, typename... A> class lambda_traits_helper<R (F::*)(A...) const restrict(amp)> : public lambda_traits_evaluation<R,A

利用(和其他一些人)的见解,我已经能够编写以下内容来询问正常的lambda函数类型信息(即返回类型、参数计数等)

很明显,模板专业化没有得到重视。然而,加入新的专业化

template <typename R, typename F, typename... A>
class lambda_traits_helper<R (F::*)(A...) const restrict(amp)>
  : public lambda_traits_evaluation<R,A...> {};

有没有其他方法可以查询lambda中的类型,或者从lambda类型中去掉限制?

即使在未计算的上下文中,也无法形成指向amp限制函数的指针,这是一个令人沮丧的问题。但是,有一种解决方法,只要您可以要求amp限制的lambda是cpu,amp限制的,它就是可行的。在这种情况下,您可以抛弃amp限制,形成一个指向cpu限制成员函数的指针——您可以进一步查询该函数

请参阅以下概念证明:

#include <type_traits>

template <typename R, typename F, typename... A>
auto get_R(R (F::*)(A...) const) -> R
{}

template <typename L>
struct lambda_traits
{
    using ret_type = decltype(get_R(&L::operator()));
};

int main()
{
    auto lambda_1 = [](int) restrict(cpu,amp) -> void {};
    auto lambda_2 = [](int) restrict(cpu,amp) -> int { return 0; };

    // Test:
    static_assert(std::is_same<lambda_traits<decltype(lambda_1)>::ret_type, void>::value, "Failed 1.");
    static_assert(std::is_same<lambda_traits<decltype(lambda_2)>::ret_type, int>::value, "Failed 2.");
}
#包括
模板
自动获取\u R(R(F::*)(A…)常量)->R
{}
模板
结构lambda_特征
{
使用ret_type=decltype(get_R(&L::operator());
};
int main()
{
自动lambda_1=[](int)restrict(cpu,amp)->void{};
自动lambda_2=[](int)restrict(cpu,amp)->int{return 0;};
//测试:
静态断言(std::is_same::value,“Failed 1”);
静态断言(std::is_same::value,“Failed 2”);
}

希望有帮助

嗯,这确实是一个可行的解决办法。我担心我不能用它来专门化模板化的
restrict(amp)
函数,因为我希望这会丢弃
restrict(cpu)
部分。奇怪的是,即使在封闭的
amp
restricted作用域中,cpu限制似乎仍然依附于lambda定义(尽管它不可调用)。我不确定这是否是一个错误的实现或什么,但它觉得有点破碎。。。不管是哪种方式,感谢您发现了这一点,我想不出对lambda需要额外的
cpu
限制会有什么负面影响。是的,限制不会(非正式地)“在跨越限制边界时取消”。否则,您将无法从cpu受限的上下文中使用amp受限的lambda为每个调用并行。\u。啊,当然这是一个好的观点,我想我在
restric
上绘制成员函数重载的并行时会感到困惑。为帮助和想法干杯!
template <typename R, typename F, typename... A>
class lambda_traits_helper<R (F::*)(A...) const restrict(amp)>
  : public lambda_traits_evaluation<R,A...> {};
error C3939: 'abstract declarator' : pointer to member functions, function
             pointers, references to functions with 'amp' restriction
             specifier are not allowed
#include <type_traits>

template <typename R, typename F, typename... A>
auto get_R(R (F::*)(A...) const) -> R
{}

template <typename L>
struct lambda_traits
{
    using ret_type = decltype(get_R(&L::operator()));
};

int main()
{
    auto lambda_1 = [](int) restrict(cpu,amp) -> void {};
    auto lambda_2 = [](int) restrict(cpu,amp) -> int { return 0; };

    // Test:
    static_assert(std::is_same<lambda_traits<decltype(lambda_1)>::ret_type, void>::value, "Failed 1.");
    static_assert(std::is_same<lambda_traits<decltype(lambda_2)>::ret_type, int>::value, "Failed 2.");
}