gpt4 book ai didi

c++ - 如何静态检查模板的类型 T 是否为 std::vector,其中 U 为 float、double 或 integral

转载 作者:可可西里 更新时间:2023-11-01 15:41:00 24 4
gpt4 key购买 nike

我如何检查参数包中的参数是否具有 float 中的任一类型? , double , integral , 或 std::vector其中的?

例如T={int, long, std::vector<double>}很好,

同时 T={int, long, std::vector<long double>}不是,因为我们不允许 std::vector属于 long double类型。

我已经走到这一步了

template<class ...T>
void foo(T... t)
{
static_assert(std::is_same<float, T...>::value
|| std::is_same<double, T...>::value
|| std::is_integral<T...>::value
/* || std::is_same<std::vector<float/double/integral>, T>::value ? */
, "unsupported type!");
}

不知道如何表达std::vector的限制.

重用 float/double/integral 会很好以某种方式检查,这样我们就不需要输入两次。有点像

bool basic_check = std::is_same<float, T...>::value
|| std::is_same<double, T...>::value
|| std::is_integral<T...>::value;

static_assert(basic_check
|| std::is_same<std::vector<basic_check>, T>
, "unsupported type!");

我还希望断言在 T={} 时成功(即通过构建) .

最佳答案

您可以使用模板特化创建自己的支票。我扩大了检查范围以包括 long double 只是为了减少代码的大小。

#include <type_traits>
#include <vector>

template<class T>
struct is_ok {
static constexpr bool value =
std::is_floating_point<T>::value ||
std::is_integral<T>::value;
};

template<class T>
struct is_ok<std::vector<T>> {
static constexpr bool value =
std::is_floating_point<T>::value ||
std::is_integral<T>::value;
};

这是一个演示:

#include <cstdio>
#define TEST(x) \
std::printf("%s: %s\n", #x, is_ok<x>::value ? "true" : "false")

int main() {
TEST(int);
TEST(float);
TEST(char *);
TEST(std::vector<int>);
TEST(std::vector<float>);
TEST(std::vector<char *>);
return 0;
}

输出:

int: true
float: true
char *: false
std::vector<int>: true
std::vector<float>: true
std::vector<char *>: false

关于c++ - 如何静态检查模板的类型 T 是否为 std::vector<U>,其中 U 为 float、double 或 integral,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29191635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com