2010-05-21 3 views
1

В C# я использую Func для замены заводов. Например:Как имитировать Func <T1, T2, TResult> в C++?

class SqlDataFetcher  
{ 
    public Func<IConnection> CreateConnectionFunc; 

    public void DoRead() 
    { 
     IConnection conn = CreateConnectionFunc(); // call the Func to retrieve a connection 
    } 
} 

class Program  
{ 
    public void CreateConnection() 
    { 
     return new SqlConnection(); 
    } 

    public void Main() 
    { 
     SqlDataFetcher f = new SqlDataFetcher(); 
     f.CreateConnectionFunc = this.CreateConnection; 
     ... 
    } 
} 

Как смоделировать код выше на C++?

ответ

4

Использовать либо std::tr1::function<IConnection*()>, либо boost::function<IConnection*()> в качестве эквивалента Func<IConnection>.

Когда вы приходите для назначения функции, вам необходимо связать объект и функцию вместе;

f.CreateConnectionFunc = this.CreateConnection; 

станет

f.CreateConnectionFunc = std::tr1::bind(&Program::CreateConnection,this); 

(Это предполагает, что CreateConnection не статическая функция - ваш пример кода не получить его statics правильно, так что трудно сказать, что именно вы имели в виду).

+1

+1, но 'boost :: function ' (обратите внимание на указатель). – avakar

+0

Хорошая точка. И вместо этого вы можете захотеть вернуть умный указатель, чтобы быть явным о праве собственности. –

+0

Такой быстрый ответ. Благодаря! – Zach

Смежные вопросы