У меня есть класс, который, интерфейс-накрест, так просто, как это:Могу ли я выполнить требование счетчика вызовов оператора во время компиляции?
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 */
Теперь мне интересно, есть ли способ обеспечить это во время компиляции либо с использованием той же самой технологии прокси, либо с использованием другой стратегии.
Другой пример того, что я хотел бы добиться: соблюдение толкая по крайней мере один int
после любого количества float
было передано оператору:
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, вам следует использовать шаблоны вариационной функции. –