Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C++;_C++_Templates - Fatal编程技术网

C++ 使用C++;

C++ 使用C++;,c++,templates,C++,Templates,我知道这听起来有点奇怪,但这就是我想做的:假设我有一个函数void f(),我想为这个方法添加跟踪。我希望通过跟踪消息(如“Entered function f”和“exit function f”)来跟踪此函数的启动和退出。我不想为入口和出口添加手动跟踪条目,因为我可能会在某些返回路径上出错。因此,可以在编译时使用模板魔术并自动生成这些字符串。i、 我想要达到的是 void f() { some_template<magic>("f"); } void f() { 一些模板(

我知道这听起来有点奇怪,但这就是我想做的:假设我有一个函数
void f()
,我想为这个方法添加跟踪。我希望通过跟踪消息(如“Entered function f”和“exit function f”)来跟踪此函数的启动和退出。我不想为入口和出口添加手动跟踪条目,因为我可能会在某些返回路径上出错。因此,可以在编译时使用模板魔术并自动生成这些字符串。i、 我想要达到的是

void f()
{
  some_template<magic>("f");
}
void f()
{
一些模板(“f”);
}

这应该在构造函数中添加跟踪消息“Entered function f”,在析构函数中添加跟踪消息“exit function f”。我希望它在编译时运行,不希望创建任何运行时对象。有可能在C++中吗?如果可以做到这一点,我可以在哪里找到更多信息?

您确实需要让调试器或编译器执行此任务。如果不创建对象,就无法使用RAII,此外,任何模板都无法访问函数的名称

然而,如果你能接受一个对象,那也没什么大不了的

class tracer {
    std::string exit;
public:
    tracer(std::string entry, std::string exit_)
        : exit(exit_) {
        std::cout << entry;
    }
    ~tracer() { std::cout << exit; }
};

void f() {
    tracer scope("Oh hai, I is entering f()", "Oh bai, I is leaving f()");
}
类跟踪器{
std::字符串出口;
公众:
跟踪器(标准::字符串入口,标准::字符串出口)
:退出(退出){

std::cout只有在运行时才知道该方法的剩余位置,因为任何类型的异常都可能发生在代码中的任何位置(一般来说)因此,这里不可能有编译时解决方案。

所有代码都是在编译时创建的,那么类有什么问题呢?编译器会将构造函数和析构函数调用粘贴到它们所属的位置,这正是您想要的。运行时的成本是调用这些函数,这是完全不可避免的,因为这是您的目标


保存
“f”时可能会出现以下情况
将花费您一个
char const*
,但是任何优秀的优化器都会注意到字符串文本是一个常量,在整个函数中不会改变,因此它不需要存储,但可以重新加载。让优化器决定缓存指针是否有效;我无法预测它。

如果您真的这么想的话这是一个选项。但是,这样做的阈值相当高,我认为如果您这样做,您会发现自己被输出淹没。更好的选项是使用调试器(设置断点以打印某些输出)或者像DeadMG建议的那样包装在类中的好的ol'printf/cout。
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>和
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu并立即添加“不想创建任何运行时对象”“.目标中的矛盾。:P.若不想在运行时创建对象,构造函数和析构函数中跟踪消息的意义是什么?您所要求的似乎是一个静态分析工具和调用树。使用这些词搜索可能会有所帮助。