0

我想知道为什么以下代码不能按预期工作(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>());
4

1 回答 1

1

您正在与 比较std::remove_cvref<T>,它本身是一种类型,理所当然地不是数字。但我假设您想针对 trait:std::remove_cvref<T>::type或 better产生的类型进行测试std::remove_cvref_t<T>

现在

template<typename T>
static constexpr int is_numeric = mp_count_if_q<NumericTypes,
mp_bind_front<std::is_same,std::remove_cvref_t<T>>>::value;

按预期工作!

于 2020-07-02T09:31:08.057 回答