あなたがC++ 17を使用することができる場合は、あなたがこれを行うことができます:あなたは、次を使用することができますC++ 14では
#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;
}
を定義:
とにかく、それらは機能タイプ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。 return num; } ' – DeiDei
' static int num = 0; 'を宣言して' main'関数からも見えるようにする必要があります。そうでなければ、スコープ/可視性は定義した関数に限定されます。変数。静的変数は変数の存続期間にのみ影響し、スコープ/可視性には影響しません。 – nbro
@DeiDei実際のprnt()関数はa戻り値double値 – Morpheus