Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数模板的typedef的最佳替代方案?_C++_Templates_Function_Typedef - Fatal编程技术网

C++ 函数模板的typedef的最佳替代方案?

C++ 函数模板的typedef的最佳替代方案?,c++,templates,function,typedef,C++,Templates,Function,Typedef,我想做的是这样的: template <class DataType> DataType myFunc(DataType in) { ... } typedef myFunc<int> myFunc_i; myFunc_i(37); 模板 数据类型myFunc(中的数据类型) { ... } typedef myFunc myFunc_i; myFunc_i(37); ……但在C++中,Type不能用于这样的函数。我想知道的是。。。在这种情况下,人们的首选方

我想做的是这样的:

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

typedef myFunc<int> myFunc_i;

myFunc_i(37);
模板
数据类型myFunc(中的数据类型)
{
...
}
typedef myFunc myFunc_i;
myFunc_i(37);

……但在C++中,Type不能用于这样的函数。我想知道的是。。。在这种情况下,人们的首选方案是什么?我能想到的只有:

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

inline int myFunc_i(int in)
{
    return myFunc<int>(in);
}
inline int myFunc_i(int in)
{
返回myFunc(in);
}
这会起作用,但缺点是需要额外的维护,并且可能会失去同步(即,如果更改myFunc的函数签名)

想法?

代码示例:

#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;
}
#包括
模板
T sqr(T a){
返回a*a;
}
自动s=sqr;
int main(){
std::cout试试这个:

typedef int (*myFunc_i_type)(int);
myFunc_i_type const myFunc_i = &myFunc<int>;

有些人可能不同意,有些人可能会对此表示不满,但考虑一下这个选项:

#define myFunc_i myFunc<int>
#定义myFunc\u i myFunc
就宏而言,这一个是相当安全的;唯一的危险是有人以后可能会重新定义或取消定义它


除此之外,它还有
auto const myFunc=myFunc;
的所有优点。如果您想要
auto
,但还不想使用C++0x特性,这是一种实现相同效果的更可移植的方法。

我将对Xeo的答案做一点小小的改进

而不是使用:

auto const myFunc_i = &myFunc<int>;
auto const myFunc\u i=&myFunc;
我会用

constexpr auto myFunc_i = &myFunc<int>;
constexpr auto myFunc\u i=&myFunc;

使用
decltype

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

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

myFunc_i(37);
模板
数据类型myFunc(中的数据类型)
{
...
}
使用myFunc_i=decltype(myFunc(0));
myFunc_i(37);

您的示例没有为我编译…您所说的“requires c++”是指需要c++0x,还是microsoft?@PaulMolodowitch,我是指c++0x,当然是cource的,很抱歉粗心大意我不明白,为什么不直接调用专门化
myFunc(37)这是C++中的预处理器宏的最佳用法之一,它也可以很好地与C99/C++ 11个变量宏一起使用,例如,如果你想在不必每次都键入函数的情况下显式地指定函数模板参数。例如,<代码>定义MyStudioAsLeMyType(A,…)MyFunc(A,A,VA,AgsSux*)。MSVC上的
或GCC上的
#define myFunc_allSameType(a,…)myFunc(a,####(a)(a)(a)(a)(###(u)(VA(u)ARGS)))不总是有用的,但在有很多s、 这不起作用。它相当于“使用myFunc_i=int;”。有关正确的版本,请参阅RiaD的答案。
template <class DataType>
DataType myFunc(DataType in)
{
   ...
}

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

myFunc_i(37);