Указатель на функцию перегрузки - PullRequest
2 голосов
/ 07 октября 2011

Допустим, я хочу эту вещь:

    std::thread(std::sin,2.9);

Но я получаю неразрешенную ошибку типа функции.Как я могу решить это?std::sin перегружен, а не template (почему ??)

Ответы [ 4 ]

4 голосов
/ 07 октября 2011

В зависимости от того, какие заголовки вы включили, существует следующее:

template<class T> complex<T>  sin (const complex<T>&);  // <complex>
template<class T> valarray<T> sin (const valarray<T>&); // <valarray>
float sin(float);             // <cmath>
long double sin(long double); // <cmath>

Как вы можете видеть, включает шаблонов, хотя это на самом деле здесь не совсем уместно.

Вам просто нужно сообщить компилятору, какую [потенциальную] перегрузку вы хотите (вероятно, только из последних двух):

std::thread((float(*)(float))&std::sin, 2.9);
2 голосов
/ 07 октября 2011

Вы могли бы

  typedef double (*sind)(double);

  std::thread((sind) std::sin,2.9);
1 голос
/ 07 октября 2011

Я предпочитаю лямбда-решение.Он читается намного чище, чем все, что связано с указателем на функцию.Это также будет быстрее, чем использование указателя на функцию, но обычно это не имеет значения.

std::thread( []( double x ) { return std::sin(x); }, 2.9 );
1 голос
/ 07 октября 2011

Вы должны привести указатель функции к типу правильной перегрузки:

std::thread((float(*)(float))std::sin, 2.9);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...