gpt4 book ai didi

C++ 使用 constexpr 函数的参数作为模板常量

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:28 27 4
gpt4 key购买 nike

由于 C++ 不允许模板类具有“auto”类型的值参数模板(您可以 template<int N>template <EnumFoo E> ,但您不能真正匹配两者),我想为 type+ 编写一个包装器值(value)。

真正的问题是,没有人愿意同时写值和它的类型,我试着写了一个有点类似于make_unique的函数。 , 除了创建一个 std::unique对象,它应该有一个作为包装器的返回类型。

这是我写的:

enum class E1
{
First
};

enum class E2
{
First
};

/*
* Here, the goal is to be able to have a ClassTemplatedOnAnyValueNoMatterType
* you can template on E1::First, or E2::First, and the template instances
* are NOT the same one.
* We need a wrapper (EnumValueWrapper).
*/
template <typename T>
struct ClassTemplatedOnAnyValueNoMatterType
{};

template <typename T, T Value>
struct EnumValueWrapper
{
static const T value = Value;
};

/*
* Since it's annoying to write EnumValueWrapper<E1, E1::First>, we'd like to
* have a utility function that generates the EnumValueWrapper type.
*/
template <typename T>
// does NOT compile, t outside of function body
constexpr auto makeEnumValueWrapper(const T t) -> EnumValueWrapper<T, t>;

typedef ClassTemplatedOnAnyValueNoMatterType<decltype(makeEnumValueWrapper(E1::First))> MyClass;

int main()
{
MyClass s;
}

这不会编译,我想知道是否有任何替代方案,使用尽可能少的宏(没有 MACRO(E1, First) ,因为我不仅希望能够使用垃圾,而且希望也可以使用 int 类型)。

有什么想法吗?

最佳答案

这不能解决您的问题吗:

template <typename T>
struct Dummy
{
template <T t>
friend EnumValueWrapper<T, t> makeEnumValueWrapper();
};
template struct Dummy<E1>;
typedef ClassTemplatedOnAnyValueNoMatterType<decltype(makeEnumValueWrapper<E1::First>())> MyClass;

您仍然需要在每个相关类上显式实例化 Dummy,但 MyClass 的 typedef 没有多余的类型/值规范。

关于C++ 使用 constexpr 函数的参数作为模板常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24088436/

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