gpt4 book ai didi

c++ - static_assert 成员变量在 C++17 中被标记为 'static'?

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:47 24 4
gpt4 key购买 nike

我一直在研究模板,并希望强制赋予函数的模板类型具有特定的静态成员。不幸的是,没有 std::is_static 类型特征。

我将如何使用它(或替代方案)的粗略示例:

template<typename T>
void SomeFunc(T& obj)
{
static_assert(std::is_static_v<decltype(T::someVariable)>, "someVariable must be static");
}

有什么方法可以实现这种行为吗?我可以写

template<typename T>
void SomeFunc(T& obj)
{
// must be static
T::someVariable;
}

但这不会像带有体面消息的 static_assert 那样漂亮或信息丰富。这只是某种语法错误:(

谢谢!

最佳答案

如果我没看错你想要什么,你正在寻找 std::is_member_pointer(或者 std::is_member_pointer 的相反值)。

一个示例(也符合 C++11 和 C++14)

#include <type_traits>

struct foo
{ int value; };

struct bar
{ static int value; };

int main()
{
static_assert(
true == std::is_member_pointer<decltype(&foo::value)>::value, "!");
static_assert(
false == std::is_member_pointer<decltype(&bar::value)>::value, "!!");
}

-- 编辑 --

不确定是否理解 nakiya 的反对意见,但是......在下面的例子中,我开发了一个类型特征(hasSomeValueStatic),将 value 设置为 true 如果模板参数有一个 someValue 静态成员和 false 否则(如果 someValue 不是 static 没有 someValue

#include <iostream>
#include <type_traits>

struct foo
{ int someValue; };

struct bar
{ static int someValue; };

template <typename, typename = int>
struct hasSomeValueStatic : std::false_type
{ };

template <typename T>
struct hasSomeValueStatic<T, decltype(T::someValue, 0)>
: std::integral_constant<bool,
! std::is_member_pointer<decltype(&T::someValue)>::value>
{ };

int main()
{
std::cout << hasSomeValueStatic<foo>::value << std::endl; // print 0
std::cout << hasSomeValueStatic<bar>::value << std::endl; // print 1
std::cout << hasSomeValueStatic<int>::value << std::endl; // print 0
}

关于c++ - static_assert 成员变量在 C++17 中被标记为 'static'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44124315/

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