Лучшая альтернатива typedef для шаблона функции?

Что бы я хотел сделать, это примерно так:

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).

Мысли?

Ответы

Ответ 1

Используйте decltype:

template <class DataType>
DataType myFunc(DataType in)
{
   ...
}

using myFunc_i = decltype(myFunc<int>(0));

myFunc_i(37);

Ответ 2

Попробуйте следующее:

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>;

Ответ 3

Некоторые могут не согласиться, некоторые могут подержать колени против этого, но рассмотрите этот вариант:

#define myFunc_i myFunc<int>

Что касается макросов, это вполне безопасно; единственная опасность состоит в том, что кто-то может переопределить или определить его позже.

Кроме того, он имеет все преимущества auto const myFunc = myFunc<int>;. Если вы хотите auto, но не хотите использовать возможности С++ 0x, это более переносимый способ добиться такого же эффекта.

Ответ 4

Пример кода:

#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 может быть получен из типа аргумента)

Ответ 5

Я бы сделал крошечное улучшение по сравнению с ответом Xeo.

Вместо использования:

auto const myFunc_i = &myFunc<int>;

Я бы использовал

constexpr auto myFunc_i = &myFunc<int>;