альтернативные имена функций-членов - PullRequest
2 голосов
/ 06 июля 2011

Я пытаюсь создать альтернативные имена для вызова функции numberedFunction, когда он имеет определенные значения, как показано ниже

template< typename T >
class X
{
  public:

    X() : single( std::bind( &X::numberedFunction, *this, 1 ) ),
          halfDozen( std::bind( &X::numberedFunction, *this, 6 ) )
    { ... }

    T numberedFunction( unsigned int i ) { ... }

    const std::function< T() >& single;
    const std::function< T() >& halfDozen;
};

Но этот код неверен (segfaults, когда я пытаюсь использовать любой изименованные функции).Есть ли проблема с использованием this в том виде, в котором я нахожусь в списке инициализации (например, не гарантированно ли это правильно сформировано во время доступа к нему там)?Что-то еще (очевидное)?Есть ли лучше способ сделать то, что я пытаюсь сделать (я чувствую, что почти наверняка есть)?

Ответы [ 3 ]

5 голосов
/ 06 июля 2011
const std::function< T() >& single;
const std::function< T() >& halfDozen;

Ваши члены являются ссылками на const, но вы инициализируете их из временного конструктора (при условии, что выражения bind в вашем коде real не являются бессмысленными).Как только строительство завершено, они становятся недействительными.Это действительно то, что вы намеревались?


Может быть, это то, что вы хотите сделать (используя здесь психические силы):

template< typename T >
class X
{
  public:

    X() : single( std::bind( &X::numberedFunction, this, 1 ) ),
          halfDozen( std::bind( &X::numberedFunction, this, 6 ) )
    { ... }

    T numberedFunction( unsigned int i ) { ... }

    const std::function< T() > single;
    const std::function< T() > halfDozen;
};

Обратите внимание, что я привязан к thisне *this.Это позволяет избежать копирования, но может оказаться не тем, что вы хотите.

3 голосов
/ 06 июля 2011

Альтернативный подход - просто добавить несколько функций пересылки:

T numberedFunction( unsigned int i ) { ... }

T single()
{ return numberedFunction(1); }

T halfDozen()
{ return numberedFunction(6); }
0 голосов
/ 06 июля 2011

Вы используете этот указатель в списке инициализации.Это неинициализированный объект.Интересно, вы могли бы успешно скомпилировать этот код или нет!

См. Пример, чтобы увидеть использование bind (взято из MSDN)

// std_tr1__functional__bind.cpp 
// compile with: /EHsc 
#include <functional> 
#include <algorithm> 
#include <iostream> 

using namespace std::placeholders; 

void square(double x) 
{ 
    std::cout << x << "^2 == " << x * x << std::endl; 
} 

void product(double x, double y) 
{ 
    std::cout << x << "*" << y << " == " << x * y << std::endl; 
} 

int main() 
{ 
    double arg[] = {1, 2, 3}; 

    std::for_each(&arg[0], arg + 3, square); 
    std::cout << std::endl; 

    std::for_each(&arg[0], arg + 3, std::bind(product, _1, 2)); 
    std::cout << std::endl; 

    std::for_each(&arg[0], arg + 3, std::bind(square, _1)); 

    return (0); 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...