對於用於識別我實例一些跟蹤自動化想調用任一:在編譯時區分C++中的靜態和非靜態方法?
- 包含對象的非靜態方法返回它的識別符
- 別的它總是返回相同的id
我目前的解決方案是有一個基類,其中有一個方法()和一個全局函數which(),如果不是在一個對象的上下文中應該使用它。 但是這對於靜態成員函數不起作用,在這裏編譯器更喜歡全局函數的非靜態方法。
簡單的例子:
class IdentBase
{
public:
Ident(const std::string& id) _id(id) {}
const std::string& which() const { return _id; }
private:
const std::string _id;
};
const std::string& which() { static const std::string s("bar"); return s; }
#define ident() std::cout << which() << std::endl
class Identifiable : public IdentBase
{
public:
Identifiable() : Ident("foo") {}
void works() { ident(); }
static void doesnt_work() { ident(); } // problem here
};
我可以以某種方式避免使用變通像靜態成員函數(可能使用一些模板魔術)一個特殊的宏?
我敢肯定,有一種方法可以通過使用函數指針並使用成員函數大小寫的一些聯編程序來實現。但首先我會質疑設計。爲什麼你認爲你需要在靜態和非靜態可識別成員函數中編寫相同的代碼?像往常一樣,「我怎樣才能解決這個問題?」可能比「我被困在這條路上解決我的問題困難得多,我該如何更進一步?」 – sbi
我想使用相同的代碼,因爲我想簡單地使用一箇中央宏而不是一個用於靜態而一個用於非靜態上下文。 也許設計是不對的,但至少我自己看不到更好的設計。 –