有没有办法结合 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) 我有几个模板设置结构,可以在这些结构中使用静态断言吗?
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)
感谢您的回复!
我有一个constexpr函数模板,它采用一个char数组,其边界在编译时已知:
template<size_t N>\nconstexpr bool check(const char (&arr)[N], size_t n = 0)\nRun Code Online (Sandbox Code Playgroud)\n\n我可以在调用中将此函数与字符串文字一起使用static_assert。
在此函数中,我可以遍历字符串文字,并在编译时对组成字符串的各个字符执行计算。
\n\n但是,如果我有另一个constexpr也采用字符数组/字符串文字的函数模板
template<size_t N>\nconstexpr void test(const char (&arr)[N])\nRun Code Online (Sandbox Code Playgroud)\n\n在我调用的函数中static_assert,arr不再是常量表达式,因此static_assert不允许使用 。
鉴于字符串文字的边界在编译时已知,因此它是一个静态大小的数组,并且size_t N是一个模板参数,我认为它应该可以arr在 function 中使用test。
不可能test使用非常量数组进行调用,因此我希望编译器arr知道test.
尝试test使用非常量数组进行调用会导致不同的(预期)错误:
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) 如何避免
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) 有没有办法对编译时已知的索引进行静态断言,否则运行时断言?例子:
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) 这是代码:
#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) 我们有一个const数组结构,如下所示:
static const SettingsSuT _table [] = {{5,1},{1,2},{1,1}等};
结构有以下几点:
因此,对于单个元素,"总大小"是size_bytes*num_items.所有这些信息都在const数组中,在编译时可用.但请注意,_table的总大小与EEPROM本身的大小无关._table不镜像EEPROM,它只描述我们需要的布局,用法和其他"元数据"类型信息.但是,您可以使用此元数据来确定我们正在使用的EEPROM数量.
该阵列简单地描述了存储在外部EEPROM中的数据,该外部EEPROM具有固定/最大尺寸.随着功能的添加和删除,const数组中的条目会发生变化.我们目前对数据的总大小进行运行时检查,以确保它不超过EEPROM大小.
但是,我们已将许多这些运行时检查更改为static_assert样式模板检查,以便构建立即停止.我不是模板专家,所以可以在这个上使用一些帮助.
所以,问题是:如何创建一个模板来添加所有元素的大小(乘以每个元素的值,然后添加所有结果),然后执行static_assert并在构建超过幻数大小时停止构建的EEPROM.我把典型的递归因子模板示例看作一种方法,但它无法访问数组,它需要一个const值(我认为).
非常感谢你的帮助,
考虑这个简单的类:
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解析模板的方式.有没有办法让这个工作?
如何static_assert在C++ 11中使用EqualityComparable概念模板类型?
通过抽象类我的意思是具有至少一个纯虚方法的类.如果检查显示该类不是抽象的,我希望编译失败.
它甚至可能吗?
c++ ×10
static-assert ×10
templates ×4
c++11 ×3
compile-time ×2
crtp ×1
equality ×1
member ×1
runtime ×1