相关疑难解决方法(0)

C/C++行号

出于调试目的,我可以在C/C++编译器中获取行号吗?(某些编译器的标准方式或特定方式)

例如

if(!Logical)
    printf("Not logical value at line number %d \n",LineNumber);
    // How to get LineNumber without writing it by my hand?(dynamic compilation)
Run Code Online (Sandbox Code Playgroud)

c c++ dynamic-compilation line-numbers c-preprocessor

102
推荐指数
8
解决办法
9万
查看次数

浮点类型作为 C++20 中的模板参数

根据cppreference C++20 现在支持模板中的浮点参数。但是,我无法在该站点以及其他站点上找到任何编译器支持信息。当前的gcc主干只是这样做,其他的都是负面的。

我只想知道这是否是一个非常低优先级的功能和/或何时会得到普遍支持。

我能找到的唯一相关的东西是:P0732R2 非类型模板参数中的类类型。如果有人可以简单地解释一下,那就太好了。

c++ floating-point templates c++20

10
推荐指数
1
解决办法
423
查看次数

C++非类型模板参数const char*

让我们说我们有

template <const char*>
struct A{};

// static storage
const char a[] = "asd";
const char* p = "asd";
Run Code Online (Sandbox Code Playgroud)

这个实例化

A<a>{};
Run Code Online (Sandbox Code Playgroud)

对编译器没问题.这是可以理解的 - 数组a衰减指向第一个元素.但是,如果我们实例Ap这样的

A<p>{};
Run Code Online (Sandbox Code Playgroud)

编译器给出错误:

错误:类型为'char*'的非类型模板参数不是常量表达式

为什么标准不允许指定类型的命名变量const char*或只是字符串文字"asd",即btw左值本身,作为模板参数?

c++ templates

8
推荐指数
1
解决办法
1042
查看次数

转发非类型参数会导致变量模板上出现不同的行为

这似乎是另一个"谁做得好"?问题,因为gcc 6.0.0和clang 3.7.0表现不同.

假设我们有一个变量模板,它采用const char *非模板参数,并且专用于给定的指针:

constexpr char INSTANCE_NAME[]{"FOO"};

struct Struct{ void function() const { std::cout << __PRETTY_FUNCTION__; } };
std::ostream &operator <<(std::ostream &o, const Struct &) { return o << INSTANCE_NAME; }

template <const char *> char   Value[]{"UNKNOWN"};
// spezialization when the pointer is INSTANCE_NAME
template <            > Struct Value<INSTANCE_NAME>{};
Run Code Online (Sandbox Code Playgroud)

请注意,模板变量具有不同的类型,具体取决于特化.十,我们有两个模板函数,每个函数都有一个const char *非模板参数,并将转发给变量模板:

template <const char *NAME> void print()
{
    std::cout << Value<NAME> << '\n';
}

template <const char *NAME> void …
Run Code Online (Sandbox Code Playgroud)

c++ template-specialization variable-templates c++14

6
推荐指数
2
解决办法
232
查看次数

在不使用宏的情况下减少语法"噪音"

我试图找到一种方法来减少一些语法"噪音"而不诉诸宏.对于以下代码:

struct base { base() = delete; };    
struct tag1 final : private base
{
    static constexpr const char* name = "tag1";
};
template <typename T> std::string name() { return T::name; }
// ...
int main()
{
   const std::string name1(name<tag1>());
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这将是很好摆脱的一些static constexpr const char*(更不用提其他)语法,因为它很烦人的重复,对tag2,tag3等等.另外,所有的这是非常有趣的是唯一的一部分tag1,其余的是"噪声".直接的解决方案使用宏:

#define MAKE_TAG(tag_name) struct tag_name final : private base { \
    static constexpr const char* name = #tag_name; }    
MAKE_TAG(tag2);
// ...
const std::string …
Run Code Online (Sandbox Code Playgroud)

c++ macros templates

6
推荐指数
1
解决办法
172
查看次数

'char const *str' 作为模板参数

可以说我有一个模板:

template<char const *str>
class Template { ... };
Run Code Online (Sandbox Code Playgroud)

为什么不能写出下面的内容呢?

Template<"literal"> T;
Run Code Online (Sandbox Code Playgroud)

或者

char const *s = "Literal";
Template<s> T;
Run Code Online (Sandbox Code Playgroud)

为什么下面的方法有效?

char const s[] = "Literal";
Template<s> T;
Run Code Online (Sandbox Code Playgroud)

c++ templates constants

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