功能模板的typedef的最佳替代方案?

时间:2011-12-16 23:17:12

标签: c++ templates function typedef

我想做的是这样的事情:

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

typedef myFunc<int> myFunc_i;

myFunc_i(37);

...但是,在C ++中,typedef不能用于这样的函数。我想知道的是......在这种情况下,人们首选的选择是什么?我唯一能想到的是:

1)只需处理它,并始终使用myFunc语法 2)手动创建包装函数,即

inline int myFunc_i(int in)
{
    return myFunc<int>(in);
}

这样可行,但是会有需要额外维护的缺点,以及它可能会失去同步(即,如果你更改了myFunc的函数签名)。

思想?

5 个答案:

答案 0 :(得分:14)

试试这个:

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

答案 1 :(得分:7)

有些人可能不同意,有些人可能会对此嗤之以鼻,但请考虑这个选项:

#define myFunc_i myFunc<int>

就宏来说,这个很安全;唯一的危险是有人可以在以后重新定义或取消定义。

除此之外,它具有auto const myFunc = myFunc<int>;的所有优点。如果你想要auto但不想使用C ++ 0x功能,这是一种更便携的方式来实现同样的效果。

答案 2 :(得分:5)

代码示例:

#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需要c ++ 0x,你可以使用真实的typename,但它很难看,你也需要检查更改签名。 此外,此代码可能会禁止您的编译器内联此函数

  • 至于我,通常最好使用<>的全名

  • 在您的情况下,您无需使用<>因为myFunc已足够(DataType可以从参数类型获得)

答案 3 :(得分:2)

I would make a just tiny improvement over Xeo's answer.

Instead of using:

auto const myFunc_i = &myFunc<int>;

I would use

constexpr auto myFunc_i = &myFunc<int>;

答案 4 :(得分:2)

使用decltype

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

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

myFunc_i(37);