我想知道为什么以下代码不能按预期工作(is_numeric 始终为 0)。
#include <type_traits>
#include <utility>
#include <boost/mp11/algorithm.hpp>
#include <boost/mp11/bind.hpp>
#include <boost/mp11/tuple.hpp>
using namespace boost::mp11;
using NumericTypes = std::tuple<short, unsigned short, int, unsigned int,
long int, unsigned long int,
long long int, unsigned long long int,
float, double, long double>;
template<typename T>
static constexpr int is_numeric = mp_count_if_q<NumericTypes,
mp_bind_front<std::is_same,std::remove_cvref<T>>>::value;
int main(){
return is_numeric<char>+2*is_numeric<int>;
}
我的假设是,在尝试编译东西时我犯了一些愚蠢的错误(我使用 _q 版本只是因为我无法让 mp_count_if 工作),但我没有看到任何明显的东西,并且从我发现的测试/文档中不包含某些东西类似于我相对复杂的示例。
FWIW 绑定前端似乎可以正常工作,因为我期望它可以工作......
template<typename T>
using is_int = mp_bind_front<std::is_same,int>::fn<T>;
static_assert(!is_int<float>());
static_assert(is_int<int>());