【发布时间】:2016-06-13 01:08:24
【问题描述】:
我有以下关于 std::experimental::apply 的问题。据我了解,它需要函数对象和元组,然后将元组扩展为参数包,该参数包应用于给定的函子。不幸的是,当我尝试编译(函数调用)时,下面的代码中出现类型不匹配。
template<std::size_t population_size, std::size_t generations, typename Func,
class Compare=std::greater<>,
class Generator=std::default_random_engine,
class Distribution=std::uniform_real_distribution<>>
constexpr auto optimize(Func function, const std::pair<auto,auto>... range){ //CHECKING IF FUNCTION IS A FUNCTOR, TBD!
static_assert(sizeof...(range)>2, "Function needs at least two arguments");
//RANDOM NUMBER GENERATOR AND CHECKING ARITHMETIC TYPES
constexpr decltype(auto) generate_number=[&](std::pair<auto,auto> range){
static_assert(std::is_arithmetic<std::tuple_element_t<0, decltype(range)>>(),
"First argument of std::pair has to be arithmetic!");
static_assert(std::is_arithmetic<std::tuple_element_t<1, decltype(range)>>(),
"Second argument of std::pair has to be arithmetic!");
return std::bind(Distribution(range.first,range.second),Generator());
};
//SINGLE RANDOM INDIVIDUAL GENERATOR
decltype(auto) generate_random_individual=[&](){ //RUN THIS FUNCTION ASYNCHRONOUSLY, TBD!
auto genotype=std::make_tuple(generate_number(range)()...); //WORKS FINE
//CRITICAL FUNCTION AND THE TOPIC OF THIS POST
auto key=std::experimental::apply(function,genotype);
//CRITICAL FUNCTION AND THE TOPIC OF THIS POST
//return std::make_pair(key,genotype);
};
generate_random_individual();
}
这是我的测试用例(在没有实验性::apply 的情况下应该可以正常编译)。
#include<utility>
#include<iostream>
#include"optimalization.hpp"
class Function{
public:
Function()=default;
double operator()(double x, double y, double z){
return (std::exp(x+1.25)*std::pow(y,z))/std::exp((x*y)/z);
}
};
int main(){
Function f{};
double x=optimize<100, 200>(f, std::make_pair(-21, 37), std::make_pair(22.5, 88.11), std::make_pair(-13, 37));
std::cout << x << std::endl;
}
【问题讨论】:
-
修正你的代码格式。
标签: c++ tuples c++14 variadic-templates c++17