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

Pau*_*tch 18 c++ templates typedef function

我想做的是这样的事情:

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

typedef myFunc<int> myFunc_i;

myFunc_i(37);
Run Code Online (Sandbox Code Playgroud)

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

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

inline int myFunc_i(int in)
{
    return myFunc<int>(in);
}
Run Code Online (Sandbox Code Playgroud)

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

思考?

Xeo*_*Xeo 14

试试这个:

typedef int (*myFunc_i_type)(int);
myFunc_i_type const myFunc_i = &myFunc<int>;
Run Code Online (Sandbox Code Playgroud)

如果签名myFunc永远改变,这将触发编译器错误.使它const也禁止重新分配.函数指针也可以像任何正常函数一样调用:myFunc_i(5).

如果您不想要编译器错误,而是让它自行更新,请使用auto(再次const):

auto const myFunc_i = &myFunc<int>;
Run Code Online (Sandbox Code Playgroud)


Chr*_*utz 8

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

#define myFunc_i myFunc<int>
Run Code Online (Sandbox Code Playgroud)

就宏而言,这个非常安全; 唯一的危险是有人可以在以后重新定义或取消定义.

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

  • 坦白地说,这是我在C ++中看到的预处理器宏的最佳用法之一。它也可以与C99 / C ++ 11可变参数宏一起很好地工作,例如,如果您希望能够显式指定功能模板参数而不必每次都键入它们。例如,在MSVC上的`#define myFunc_allSameType(a,...)myFunc &lt;decltype(a)&gt;(a,__VA_ARGS __)`或`#define myFunc_allSameType(a,...)myFunc &lt;decltype(a)&gt;(a ,## __ VA_ARGS __)`在GCC上。并非总是有用,但在有很多模板参数且它们都是事先已知或由参数确定的情况下很有用。 (2认同)

Ria*_*iaD 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;
}
Run Code Online (Sandbox Code Playgroud)

打印9,这意味着使用的int函数
auto需要c ++ 0x,你可以使用真实的typename,但它很丑,你也需要检查更改签名.此外,此代码可能会禁止您的编译器内联此函数

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

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


jto*_*ker 0

使用decltype

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

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

myFunc_i(37);
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。它相当于“using myFunc_i = int;”。请参阅 RiaD 的答案以获得正确的版本。 (4认同)