2011-12-16 112 views
16

我想要做的是这样的:函数模板的typedef的最佳替代方法?

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

typedef myFunc<int> myFunc_i; 

myFunc_i(37); 

...但是,类型定义不能使用这样的功能在C++中。我想知道的是......在这种情况下,人们首选的替代品是什么?我能想到的唯一的有:

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

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

这会工作,但将有需要额外维护的缺点以及它会不同步的可能性(例如,如果更改myFunc的函数签名)。

的思考?

+1

我不明白,为什么不叫专业化直接`myFunc的( 37);`? – 2011-12-17 10:44:21

回答

1

使用decltype

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

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

myFunc_i(37); 
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需要的C++ 0x,你可以使用真正的类型名称代替,但它的丑陋,你需要检查更换签名太。 此外,该代码,可能不允许你的编译器内联这个功能

  • 至于我,那么通常最好使用全名与<>

  • 你的情况,你不需要使用<>因为myFunc足够(DataType可从参数类型来得到)

+0

你的例子并不适合我......通过“requries C++”你是否需要C++ 0x或microsoft? – 2011-12-17 00:22:11

+0

@PaulMolodowitch,我的意思是C++ 0x,cource,对不起粗心 – RiaD 2011-12-17 10:42:21

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

有些人可能不同意,有些人可能会猛拉他们对这个膝盖,但考虑到这选项:

#define myFunc_i myFunc<int> 

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

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

+0

这就是......说实话,我在C++中看到了预处理宏的最好用法之一。它也可以很好地适用于C99/C++ 11可变参数宏,例如,如果您希望能够显式指定函数模板参数,而不必每次都输入它们。例如,在GCC上的`#define myFunc_allSameType(a,...)myFunc (a,__VA_ARGS __)`或`#define myFunc_allSameType(a,...)myFunc (a,## __ VA_ARGS __)`。并不总是有用,但在有很多模板参数的情况下很有用,并且它们都可以事先知道或者根据参数确定。 – 2016-02-03 22:41:36

2

我会对Xeo的答案做一个微小的改进。

而不是使用:

auto const myFunc_i = &myFunc<int>; 

我会用

constexpr auto myFunc_i = &myFunc<int>;