C++可变模板:gcc和nvcc/intel中的不同优先级
C++ variadic template: different priorities in gcc and nvcc/intel
下一个代码出现问题:
#include <iostream>
#include <functional>
using namespace std;
template<typename... Args>
inline double foo(function<double (Args...)> fun, Args... args) {
return fun(args...);
}
template<typename... Args, typename... ArgsTmp>
double foo(function<double (Args...)> fun, ArgsTmp... args) {
return foo(fun, 1., args...);
}
int main() {
function<double (double, double, double)> fun = [&](double x, double y, double z) -> double {
return x+y+z;
};
cout << foo(fun) << endl;
}
当我用gcc编译它时,一切都很好。但是,如果我试图用intel或nvcc-7.5编译它(这实际上是我的目标),我会得到以下错误:
more than one instance of overloaded function "foo" matches the argument list:
function template "double foo(std::vector<limits, std::allocator<limits>>, std::function<double (Args...)>, Args...)"
function template "double foo(std::vector<limits, std::allocator<limits>>, std::function<double (Args...)>, ArgsTmp...)"
argument types are: (std::vector<limits, std::allocator<limits>>, std::function<double (double, double, double)>, double, double, double)
...
1 error
有没有任何方法可以让编译器明确地知道,当Args==ArgsTmp
(在第二个模板中)时,foo()
的以下实现应该被拒绝?
您可以尝试SFINAE和enable_if
template<typename... Args, typename... ArgsTmp>
std::enable_if_t<!std::is_same<std::tuple<Args...>,
std::tuple<ArgsTmp...>>::value,
double>
foo(function<double (Args...)> fun, ArgsTmp... args) {
return foo(fun, 1., args...);
}
您可以考虑参数的数量:
#include <iostream>
#include <functional>
#include <type_traits>
template<typename... Args>
inline double foo(std::function<double (Args...)> fun, Args... args) {
return fun(args...);
}
// Only considered, if the number of arguments is less than the number
// of expected arguments (accepting any number of arguments may lead
// to infinite recursion).
template<typename... Args, typename... ArgsTmp>
inline typename std::enable_if<sizeof...(ArgsTmp) < sizeof...(Args), double>::type
foo(std::function<double (Args...)> fun, ArgsTmp... args) {
return foo(fun, 1., args...);
}
int main()
{
// A shorter variant
std::function<double (double)> fun = [&](double x) -> double {
return x;
};
std::cout << foo(fun) << std::endl;
std::cout << foo(fun, 2.0) << std::endl;
// error: no matching function for call to ‘foo(std::function<double(double)>&, double, double)’
// std::cout << foo(fun, 3.0, 4.0) << std::endl;
}
相关文章:
- 编译时未启用intel oneApi CUDA支持
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 排序数组优先级队列
- 更改运行时优先级队列的排序功能
- 优先级队列构造函数的工作
- 实现优先级队列
- 优先级队列功能比较
- C++ 带有函数指针的运算符优先级
- 将更高的优先级设置为 boost::asio 线程处理进程
- 在C++中打印对的优先级队列的所有值时出现问题
- <<运算符优先级与字符串比较
- SFINAE 模板专用化优先级
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++可变模板:gcc和nvcc/intel中的不同优先级