如果你可以使用C++ 17,你可以這樣做:
#include <iostream>
template<auto> struct counter { static int value; };
template<auto F> int counter<F>::value = 0;
void prnt() { ++counter<&prnt>::value; }
void callprnt() { ++counter<&callprnt>::value; prnt(); }
int main() {
for (int i = 0; i < 8; ++i) { prnt(); }
for (int i = 0; i < 10; ++i) { callprnt(); }
std::cout << counter<&prnt>::value << std::endl;
std::cout << counter<&callprnt>::value << std::endl;
}
在C++ 14可以使用以下定義:
template<void(*)()> struct counter { static int value; };
template<void(*F)()> int counter<F>::value = 0;
無論如何,它們被限制爲功能類型void(void)
。
通過一些工作,您可以調整解決方案,使其接受任何類型的函數。
作爲最小的,工作示例:
#include <iostream>
template<typename R, typename... A>
struct family {
template<R(*)(A...)>
struct wrapper {
static int value;
};
};
template<typename R, typename... A>
template<R(*F)(A...)>
int family<R, A...>::wrapper<F>::value = 0;
template<typename R, typename... A>
constexpr family<R, A...> fam(R(*)(A...));
void prnt() { ++decltype(fam(&prnt))::template wrapper<prnt>::value; }
void callprnt() { ++decltype(fam(&callprnt))::template wrapper<callprnt>::value; prnt(); }
int main() {
for (int i = 0; i < 8; ++i) { prnt(); }
for (int i = 0; i < 10; ++i) { callprnt(); }
std::cout << decltype(fam(&prnt))::template wrapper<prnt>::value << std::endl;
std::cout << decltype(fam(&callprnt))::template wrapper<callprnt>::value << std::endl;
}
'INT PRNT(){靜態INT NUM = 0;返回num; }' – DeiDei
您需要在任何函數之外聲明'static int num = 0;',以便它也可以從'main'函數中看到,否則它的作用域/可見性僅限於定義它的函數,即使它是靜態的變量。此處的靜態隻影響變量的生命週期,而不影響其範圍/可見性。 – nbro
@DeiDei實際的prnt()函數是一個返回一個double值 – Morpheus