出于调试目的,我可以在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) 根据cppreference C++20 现在支持模板中的浮点参数。但是,我无法在该站点以及其他站点上找到任何编译器支持信息。当前的gcc主干只是这样做,其他的都是负面的。
我只想知道这是否是一个非常低优先级的功能和/或何时会得到普遍支持。
我能找到的唯一相关的东西是:P0732R2 非类型模板参数中的类类型。如果有人可以简单地解释一下,那就太好了。
让我们说我们有
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
衰减指向第一个元素.但是,如果我们实例A
与p
这样的
A<p>{};
Run Code Online (Sandbox Code Playgroud)
编译器给出错误:
错误:类型为'char*'的非类型模板参数不是常量表达式
为什么标准不允许指定类型的命名变量const char*
或只是字符串文字"asd"
,即btw左值本身,作为模板参数?
这似乎是另一个"谁做得好"?问题,因为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) 我试图找到一种方法来减少一些语法"噪音"而不诉诸宏.对于以下代码:
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) 可以说我有一个模板:
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)