Ответ 1
Используйте decltype
:
template <class DataType>
DataType myFunc(DataType in)
{
...
}
using myFunc_i = decltype(myFunc<int>(0));
myFunc_i(37);
Что бы я хотел сделать, это примерно так:
template <class DataType>
DataType myFunc(DataType in)
{
...
}
typedef myFunc<int> myFunc_i;
myFunc_i(37);
... однако, typedefs нельзя использовать для таких функций, как это в С++. Мне было интересно, что люди предпочитают альтернативы в этом случае? Единственными, о которых я могу думать, являются:
1) Просто с этим справитесь и всегда используйте синтаксис myFunc 2) Вручную создайте функцию обертки, т.е.
inline int myFunc_i(int in)
{
return myFunc<int>(in);
}
Это сработает, но будет иметь недостаток в необходимости дополнительного обслуживания и возможности его выхода из синхронизации (т.е. если вы измените подпись функции для myFunc).
Мысли?
Используйте decltype
:
template <class DataType>
DataType myFunc(DataType in)
{
...
}
using myFunc_i = decltype(myFunc<int>(0));
myFunc_i(37);
Попробуйте следующее:
typedef int (*myFunc_i_type)(int);
myFunc_i_type const myFunc_i = &myFunc<int>;
Это приведет к ошибке компилятора, если будет изменяться подпись myFunc
. Создание const
также запрещает переназначение. Указатели функций также могут быть вызваны как любая нормальная функция: myFunc_i(5)
.
Если вы не хотите ошибки компилятора, а имеете его обновление, используйте auto
(опять же с const
):
auto const myFunc_i = &myFunc<int>;
Некоторые могут не согласиться, некоторые могут подержать колени против этого, но рассмотрите этот вариант:
#define myFunc_i myFunc<int>
Что касается макросов, это вполне безопасно; единственная опасность состоит в том, что кто-то может переопределить или определить его позже.
Кроме того, он имеет все преимущества auto const myFunc = myFunc<int>;
. Если вы хотите auto
, но не хотите использовать возможности С++ 0x, это более переносимый способ добиться такого же эффекта.
Пример кода:
#include <iostream>
template <typename T>
T sqr(T a){
return a*a;
}
auto s = sqr<int>;
int main() {
std::cout<<s(3.9);
return 0;
}
печатает 9, это означает, что используемая функция int
auto
требуется С++ 0x, вместо этого вы можете использовать реальное имя-имя, но оно уродливое, и вам тоже нужно будет сменить подпись.
Кроме того, этот код может запретить вашему компилятору встроить эту функцию
Для меня часто лучше использовать полное имя с <>
В вашем случае вам не нужно использовать <>
, потому что myFunc
достаточно (DataType
может быть получен из типа аргумента)
Я бы сделал крошечное улучшение по сравнению с ответом Xeo.
Вместо использования:
auto const myFunc_i = &myFunc<int>;
Я бы использовал
constexpr auto myFunc_i = &myFunc<int>;