2016-04-25 9 views
-1

рассмотрим код:как сделать оператор имеет явный параметр C++

void foo() { } 
bool bar() { return true; } 

struct S 
{ 
    void operator=(std::function<void()> f){f();}; 
    void operator=(std::function<bool()> f){f();};  
}; 

int main() { 
    S s; 
    s = foo; // ok 
    s = bar; // error: use of overloaded operator '=' is ambiguous 
}  

Как я могу сделать этот пример однозначен?

+0

Может быть, я что-то отсутствует, но как 'S = BOOL()' соответствует 'void' версию' 'оператор =? И я предполагаю, что 'S = void()' и 'S = bool()' на самом деле означает нечто большее, чем 'S s; s = foo; 'и' S s; s = bar; ', правильно? –

+0

Можете ли вы сделать это [mcve] и включить сообщение об ошибке, которое вы получаете? – NathanOliver

+0

@RemyLebeau, это так, потому что 'std :: function' типа type erasure – WhiZTiM

ответ

2

Проблема вы бежите в том, что std::function<void(Args...)> разрешено отказаться от типов возврата - так как std::function<void()> и std::function<bool()> могут быть построены из bool(*)(). Последний будет двигаться по возвращению с bar, но первый будет просто отбросить его. Это совершенно правильное поведение, но это вызывает неоднозначность.

То, что вы, вероятно, хотите, чтобы избежать std::function вообще:

template <class F> 
void operator=(F f) { f(); } 
+0

Что делать, если я хочу, чтобы каждая функция возвращала что-то другое? Явная специализация шаблонов была бы моим решением, но тогда я должен использовать простые указатели функций правильно? – Julian

+0

@Julian Это полностью зависит от того, что именно вы на самом деле хотите сделать. – Barry