как передать указатель на функцию в качестве параметра шаблона - PullRequest
1 голос
/ 14 декабря 2011

вторая строка компилируется хорошо, но третья выдает ошибку

int (* const f)() = ff;
cout << typeid(replace<int (*)(), int, char>::type).name() << endl;
cout << typeid(replace<f, int, char>::type).name() << endl;

test.cpp:3:25: error: the value of ‘f’ is not usable in a constant expression 
test.cpp:1:15: note: ‘f’ was not declared ‘constexpr’
test.cpp:3:37: error: template argument 1 is invalid

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Аргумент шаблона может быть указателем на функцию, только если параметр является нетиповым параметром.Но, к сожалению, C ++ 11 даже еще не позволяет использовать все разнообразие константных выражений для вычисления аргумента шаблона.Для нетипового указателя или ссылки вы можете только передать значение другого параметра шаблона или непосредственно полученный адрес функции или объекта, не сохраняя его сначала в переменной const / constexpr.

Это ограничение, скорее всего, будет снято для следующей версии C ++.

0 голосов
/ 14 декабря 2011

Вы можете использовать шаблонный интерфейс вместо указателя функции:

template<class T>
class IMyInterface{
public:
 virtual void doSomething(const T& arg) =0;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...