gpt4 book ai didi

c++ - 是否可以在编译时输出 constexpr 变量来调试模板元程序?

转载 作者:太空狗 更新时间:2023-10-29 21:32:41 24 4
gpt4 key购买 nike

我正在调试一个元函数,它遍历可变模板参数并检查对(TypeTag)以查看每个 Type 是否是用相应的 Tag 标记:

template<typename Type, typename Tag, typename ... Rest> 
constexpr bool taggedTypes()
{
constexpr std::size_t restN = sizeof ...(Rest);
static_assert(restN % 2 == 0, "Odd number of (Type, Tag) pairs.");

constexpr bool pairDoesntMatch = ! taggedType<Type, Tag>();
if constexpr (pairDoesntMatch)
return false;

// Single pair, empty Rest, pair matches.
if (restN == 0)
return true;

// More than two pairs, test further.
if (restN > 2)
taggedTypes<Rest...>();

return true;
}

我的代码有问题,我想调试它。

如果我使用 static_assert输出 restN 或任何其他 constexpr 变量,我的程序将在编译时中断断言并输出我指定的输出。此外,我还不清楚如何使用 static_assert() 写下除字符串文字以外的任何内容。

如何让元程序迭代可变参数模板参数并输出调试所需的内容?

完整示例:

#include <cassert> 
#include <type_traits>
#include <cstddef>

struct fruit_tag {};
struct veggie_tag {};


template<typename T>
struct tag;

template<typename T, typename Tag>
constexpr
bool
taggedType()
{
constexpr bool sameTypes
= std::is_same<typename tag<T>::type, Tag>();

static_assert(sameTypes);

return sameTypes;
}

template<typename Type, typename Tag, typename ... Rest>
constexpr bool taggedTypes()
{
constexpr std::size_t restN = sizeof ...(Rest);
static_assert(restN % 2 == 0, "Odd number of (Type, Tag) pairs.");

constexpr bool pairDoesntMatch = ! taggedType<Type, Tag>();
if constexpr (pairDoesntMatch)
return false;

// Single pair, empty Rest, pair matches.
if (restN == 0)
return true;

// Many pairs, test further.
if (restN > 2)
taggedTypes<Rest...>();

return true;
}

class Orange {};

template<>
struct tag<Orange>
{
using type = fruit_tag;
};

class Apple {};

template<>
struct tag<Apple>
{
using type = fruit_tag;
};

class Turnip{};

template<>
struct tag<Turnip>
{
using type = veggie_tag;
};

int main()
{
static_assert(taggedTypes<Turnip, veggie_tag, Orange, fruit_tag>());
};

最佳答案

至于在编译类型中显示类型以供调试,您可以使用以下值实例化一个非完整类型:

template <int> struct debug_int;

然后:

constexpr int magic = 42;
debug_int<magic>{}; // Compile error: invalid use of incomplete type 'struct debug_int<42>'

Simple Demo
Demo on your case

顺便说一句,您的taggedTypes 方法可以简化为:

template <typename Tuple, std::size_t ... Is> 
constexpr bool taggedTypes(std::index_sequence<Is...>)
{
return (std::is_same<typename tag<std::tuple_element_t<2 * Is, Tuple>>::type,
std::tuple_element_t<2 * Is + 1, Tuple>>::value && ...);
}

template <typename ... Ts>
constexpr bool taggedTypes()
{
constexpr std::size_t size = sizeof ...(Ts);
//[[maybe_unused]]debug_odd<size> debug{};
static_assert(size % 2 == 0, "Odd number of (Type, Tag) pairs.");

return taggedTypes<std::tuple<Ts...>>(std::make_index_sequence<size / 2>{});
}

Demo

关于c++ - 是否可以在编译时输出 constexpr 变量来调试模板元程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54118388/

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