我想替換所有glXXXX呼叫,GL_CALL(N, ...)以便我可以列印函式和引數來跟蹤呼叫。
例如,替換glClearColor(0.0f, 0.0f, 0.0f, 1.0f)到GL_CALL(ClearColor, 0.0f, 0.0f, 0.0f, 1.0f)并在控制臺中我得到[GL_CALL] glClearColor(0, 0, 0, 1)
#include <iostream>
template <class T>
void GL_TRACE_PRINT(T const &t) {
std::cout << t << ",";
}
template<typename T, typename... Args>
void GL_TRACE_PRINT(T n, Args ... args) {
GL_TRACE_PRINT(n);
GL_TRACE_PRINT(args...);
}
#define GL_STR(s) #s
template <class F, typename ...Args>
auto GL_INVOKE(F f, Args && ...args) {
std::cout << "[GL_CALL] " << GL_STR(f) << '(';
GL_TRACE_PRINT(std::forward<Args>(args)...);
std::cout << ")\n";
return f(std::forward<Args>(args)...);
}
#define GL_CALL(N, ...) \
GL_INVOKE(gl##N, __VA_ARGS__);
但是如何在中列印函式名稱GL_INVOKE?謝謝。或者有更好的方法嗎?
目前的輸出是,glXXX函式名稱都是f.
[GL_CALL] f(0,0,0,1,)
[GL_CALL] f(0,0,0,1,)
uj5u.com熱心網友回復:
您可以將函式的字串名稱傳遞給GL_INVOKE,如下所示:
template <class F, typename ...Args>
auto GL_INVOKE(const char* fname, F f, Args && ...args) {
std::cout << "[GL_CALL] " << fname << '(';
GL_TRACE_PRINT(std::forward<Args>(args)...);
std::cout << ")\n";
return f(std::forward<Args>(args)...);
}
#define GL_INVOKE_F(N, ...) \
GL_INVOKE(#N, N, ## __VA_ARGS__)
#define GL_CALL(N, ...) \
GL_INVOKE_F(gl##N , ## __VA_ARGS__)
演示。
另外,你GL_TRACE_PRINT可以用C 17的折疊運算式來實作,這樣會簡潔很多。
template <class... Args>
void GL_TRACE_PRINT(Args const&... args) {
((std::cout << args << ","), ...);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/376716.html
上一篇:如何將各類函式作為容器進行管理
