小编alr*_*rav的帖子

C++ 检查类型是否是模板中的固定字符数组

我需要在我正在编写的模板中对字符串类型进行一些特殊处理,但我遇到了固定大小字符数组的问题。我知道我可以编写像这个答案中提到的代码来创建包装器:Const char array with template argument size vs. charpointer

但我想知道是否有一种方法可以测试这是否是带有静态断言的模板化函数中的 const char 数组,如下所示:

    template<typename T>
    void f(T& val /* a handful of other params */ )
    {
        static_assert(
            std::is_same_v < T, const char* > ||
            std::is_same_v < T, char[N] > || // how do I get/discard N here?
            std::is_same_v < T, std::string >
            , "Unsupported type" );
    }
Run Code Online (Sandbox Code Playgroud)

我这样做的动机是避免对所有有效类型组合使用大量函数签名,同时仍然确保仅允许有效类型。由于某些原因,编写所有这些类型声明和定义是一场噩梦。但是由于字符串可以出现在各种固定大小的数组中,我不确定如何在没有包装器的情况下检查它们以剥离长度数据,但随后我又开始编写大量包装器,这正是我想要避免的(如果有某种方法可以使用单个包装器编写一个简单的可重用测试,那就可以了,但我还没有弄清楚)。对于像这样的每个字符串,如果我每次在参数列表中出现字符串参数时都手动添加一个包装器,那么显然我需要编写的声明和定义的数量会增加一倍,从而创建大量冗余代码。那么有什么方法可以确定类型是否是固定数组类型,然后提取没有长度的指针,以便我可以根据 const char* 检查它?或者以某种方式忽略数组长度并仅检查它是否是我的断言中的 char 类型数组?

c++ arrays string templates

1
推荐指数
1
解决办法
1376
查看次数

如何从 constexpr 函数中调用未标记为 constexpr 的第三方库中的函数?

我想做的正是标题所说的。我有一些带有 API 的第三方代码。

评估函数所需的信息都应该在编译时可用以评估该函数。但第三方似乎并没有给它贴上constexpr悲伤的标签。此外,我没有完整实现的源代码,只有很多的标头。看起来它可能使用共享对象来评估调用,因为在深入研究 API 的头文件后,很多东西似乎都被标记为外部。由于这些调用并不是constexpr每次我尝试调用它以用于static_assert()编译时都会失败。

如何使该函数在编译时运行并在constexpr函数中使用结果来解决static_assert()条件?所有输入在编译时都是已知的。不需要外部数据。

c++ constexpr c++20

0
推荐指数
1
解决办法
122
查看次数

标签 统计

c++ ×2

arrays ×1

c++20 ×1

constexpr ×1

string ×1

templates ×1