标签: static-assert

将字符串文字添加到 static_assert

有没有办法结合 static_assert 的输出?我的意思是这样的:

template<class T>
struct X
{
static_assert(std::is_signed<T>::value, "Type " + T + " must be signed.");//this doesn't work
};
Run Code Online (Sandbox Code Playgroud)

c++ static-assert

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

结构内部允许静态断言吗?

我有几个模板设置结构,可以在这些结构中使用静态断言吗?

template<typename T, int N, (and so on...)>
struct Settings{
  static const int n = N;
  STATIC_ASSERT(n == 5);
  typedef typename T GAGA;
}
Run Code Online (Sandbox Code Playgroud)

感谢您的回复!

c++ static-assert

5
推荐指数
2
解决办法
2359
查看次数

为什么 char 数组可以在 constexpr 函数模板中使用,但不能在 static_assert 中使用

我有一个constexpr函数模板,它采用一个char数组,其边界在编译时已知:

\n\n
template<size_t N>\nconstexpr bool check(const char (&arr)[N], size_t n = 0)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以在调用中将此函数与字符串文字一起使用static_assert

\n\n

在此函数中,我可以遍历字符串文字,并在编译时对组成字符串的各个字符执行计算。

\n\n

但是,如果我有另一个constexpr也采用字符数组/字符串文字的函数模板

\n\n
template<size_t N>\nconstexpr void test(const char (&arr)[N])\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我调用的函数中static_assertarr不再是常量表达式,因此static_assert不允许使用 。

\n\n

鉴于字符串文字的边界在编译时已知,因此它是一个静态大小的数组,并且size_t N是一个模板参数,我认为它应该可以arr在 function 中使用test

\n\n

不可能test使用非常量数组进行调用,因此我希望编译器arr知道test.

\n\n

尝试test使用非常量数组进行调用会导致不同的(预期)错误:

\n\n
main.cpp:16:16: note:   template argument deduction/substitution failed:\nmain.cpp:32:15: note:   mismatched types \xe2\x80\x98const char [N]\xe2\x80\x99 and \xe2\x80\x98const …
Run Code Online (Sandbox Code Playgroud)

c++ templates static-assert

5
推荐指数
0
解决办法
1122
查看次数

保护 CRTP:私有析构函数是唯一的解决方案吗?

如何避免

template <typename Derived>
struct base { int foo() { return static_cast<Derived*>(this)->bar(); } };

struct derived : base<derived> { int bar(); };        
struct another_derived : base<derived> { int bar(); };  // error: wrong base
Run Code Online (Sandbox Code Playgroud)

派生类中没有额外的代码

这个问题之前已经被问过两次 (尽管没有避免在派生类中添加额外代码的额外条件),并给出了推荐的答案

template <typename Derived>
struct base {
  int foo() { return static_cast<Derived*>(this)->bar(); } 
private:
  ~base() {}
  friend Derived;
};
Run Code Online (Sandbox Code Playgroud)

然而,这不仅可以防止上述错误,而且还可以Base从 访问 的所有私有成员Derived。有没有替代方案可以避免这种情况?或者是否可以最终证明这是不可能的?


编辑

我实际上有一个更复杂的问题,除了通常的用法(如上所述)之外,还有

template<typename Derived>
struct intermediate : base<Derived>
{
  int bar() { return static_cast<Derived*>(this)->ark(); …
Run Code Online (Sandbox Code Playgroud)

c++ static-assert crtp language-lawyer

5
推荐指数
0
解决办法
179
查看次数

static_assert 在编译时就知道的索引

有没有办法对编译时已知的索引进行静态断言,否则运行时断言?例子:

template <class T, int Dim>
class Foo
{
    T _data[Dim];
    public:
        const T &operator[](int idx) const
        {
            static_assert(idx < Dim, "out of range"); // error C2131: expression did not evaluate to a constant
            return _data[idx];
        }
};

int main()
{
    Foo<float, 2> foo;

    foo[0];
    foo[1];
    foo[2]; // compiler error

    for (int i=0; i<5; ++i)
    {
        foo[i]; // run time assert when i > 1
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ runtime static-assert compile-time c++11

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

我不知道为什么这个 static_assert() 代码不起作用

这是代码:

#pragma once

#include <stdint.h>

namespace Detours
{
    static_assert(sizeof(uintptr_t) == sizeof(void *));
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误消息:

Error (active) E2783 expected a comma (the one-argument version of static_assert is not enabled in this mode)
Run Code Online (Sandbox Code Playgroud)

c++ static-assert

5
推荐指数
2
解决办法
1331
查看次数

想要:一个C++模板想法来解决问题,但是在编译时?

我们有一个const数组结构,如下所示:

static const SettingsSuT _table [] = {{5,1},{1,2},{1,1}等};

结构有以下几点:

  • size_bytes:
  • NUM_ITEMS:
  • 其他"元数据"成员

因此,对于单个元素,"总大小"是size_bytes*num_items.所有这些信息都在const数组中,在编译时可用.但请注意,_table的总大小与EEPROM本身的大小无关._table不镜像EEPROM,它只描述我们需要的布局,用法和其他"元数据"类型信息.但是,您可以使用此元数据来确定我们正在使用的EEPROM数量.

该阵列简单地描述了存储在外部EEPROM中的数据,该外部EEPROM具有固定/最大尺寸.随着功能的添加和删除,const数组中的条目会发生变化.我们目前对数据的总大小进行运行时检查,以确保它不超过EEPROM大小.

但是,我们已将许多这些运行时检查更改为static_assert样式模板检查,以便构建立即停止.我不是模板专家,所以可以在这个上使用一些帮助.

所以,问题是:如何创建一个模板来添加所有元素的大小(乘以每个元素的值,然后添加所有结果),然后执行static_assert并在构建超过幻数大小时停止构建的EEPROM.我把典型的递归因子模板示例看作一种方法,但它无法访问数组,它需要一个const值(我认为).

非常感谢你的帮助,

c++ templates static-assert

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

如何在成员模板中实际使用static_assert?

考虑这个简单的类:

template<class T>
class Foo{
public:
  Foo(T const& val)
    : _val(val) {}

  template<class U>
  Foo(Foo<U> const&){
    static_assert(false,"Cannot convert from Foo<U> to Foo<T>.");
  }

  operator T&() { return _val; }
  operator T const&() const{ return _val; }

private:
  T _val;
};
Run Code Online (Sandbox Code Playgroud)

它允许从模板类型隐式构造和隐式转换回该类型,一个简单的包装器.

现在,我不想在不相关的Foos 之间启用转换,这可能是因为这些隐式构造/转换.我可以将模板化的copy-ctor设为私有,但我不想发出有用的诊断信息static_assert.

这个问题,如Ideone所示,static_assert即使我甚至没有尝试复制类型,也会出现问题!在Visual Studio中,我得到了我想要的行为,但我认为这是由于VS解析模板的方式.有没有办法让这个工作?

c++ templates member static-assert c++11

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

C++ 11静态断言的相等类型?

如何static_assert在C++ 11中使用EqualityComparable概念模板类型?

c++ templates equality static-assert c++11

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

如何在编译时检查类是否是抽象的?

通过抽象类我的意思是具有至少一个纯虚方法的类.如果检查显示该类不是抽象的,我希望编译失败.

它甚至可能吗?

c++ abstract-class static-assert compile-time

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