我有一個類,接口,明智的,是如此簡單:我可以在編譯時強制執行此操作符調用次數嗎?
struct Foo
{
inline Foo & operator << (int i)
{
return *this;
}
};
然後我就可以使用它以下列方式:
Foo foo;
foo << 1 << 2 << 3 << 4;
現在我想限制使用這個運營商的。 例如,我希望它被稱爲序列點之間的偶數次。
我目前使用內部代理類來解決這個問題。臨時創建它,在控制序列的末尾,被銷燬,檢查操作了多少次被稱爲:
struct Foo
{
inline Foo() : m_count(0) {}
private:
struct FooProxy
{
friend struct Foo;
inline ~FooProxy();
inline struct Foo & operator << (int i);
private:
inline FooProxy(struct Foo &foo) : m_foo(foo) {}
struct Foo &m_foo;
};
public:
inline FooProxy operator << (int i);
private:
int m_count;
};
inline Foo::FooProxy Foo::operator << (int i)
{
++m_count;
return FooProxy(*this);
}
inline Foo & Foo::FooProxy::operator << (int i)
{
++m_foo.m_count;
return m_foo;
}
inline Foo::FooProxy::~FooProxy()
{
assert(m_foo.m_count % 2 == 0);
}
有幾個注意事項,但它主要是做這項工作:
Foo foo;
foo << 1 << 2 << 3 << 4; /* is OK */
foo << 1 << 2 << 3; /* triggers an assert */
現在我想知道是否有一種方法可以在編譯時強制執行此操作,可以使用相同的代理技術,也可以使用其他策略。
我想實現什麼又如:強制推動任意數量的float
已經傳遞給運營商後至少一個int
:
foo << 1 << 2 << 3.f << 4.f << 5; /* is OK */
foo << 1 << 2 << 3.f << 4.f; /* illegal because one `int` is needed */
請提供預期的用例,因爲它沒有任何理由爲什麼肖恩的答案不起作用。 –
你是否願意犧牲函數調用的操作符語法? – jrok
您是否需要支持C++ 03?如果你可以使用C++ 11,那麼你應該使用可變參數函數模板。 –