Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 在C++;?_C++_Templates_Macros - Fatal编程技术网

C++ 在C++;?

C++ 在C++;?,c++,templates,macros,C++,Templates,Macros,有可能吗 # define abc<T1> __abc<T1, T2> template<typename T2> void somefun() { ... abc<int>(...); abc<double>(...); ... } #定义abc" 模板void somefun(){ ... abc(…); abc(…); ... } 只是为了避免每次在C++11中调用abc时都编写它,您可以

有可能吗

# define abc<T1> __abc<T1, T2>

template<typename T2> void somefun() {
    ... 
    abc<int>(...);
    abc<double>(...);
    ...
}
#定义abc"
模板void somefun(){
... 
abc(…);
abc(…);
...
}
只是为了避免每次在C++11中调用abc时都编写它,您可以执行以下操作:

template<typename T2> void somefun() {
    template <typename T>
    using abc = __abc<T, T2>;
}
模板void somefun(){
模板
使用abc=uuu abc;
}
否则,您可以使用宏,但需要执行以下操作:

#define abc(T1) __abc<T1, T2>

//usage:

abc(Type) instance;
#定义abc(T1)u abc
//用法:
abc(Type)实例;
但因为这看起来不太自然,我个人会避免

如果要避免使用C++11之前的宏,可以执行以下操作:

template <typename T2>
struct type {
  template <typename T1>
  struct lookup {
    typedef __abc<T1,T2> type;
  };
};

template <typename T2> void somefun() {
  typedef type<T2> abc;
  typename abc::template lookup<int>::type();
}
模板
结构类型{
模板
结构查找{
类型定义uuu abc类型;
};
};
模板void somefun(){
类型定义类型abc;
typename abc::模板查找::类型();
}
但老实说,这比宏观案例更难理解


(注意:
\uu abc
保留)

是,但需要使用圆括号

# define abc(T1) __abc<T1, T2>

template<typename T2> void somefun() {
    ... 
    abc(int)(...);
    abc(double)(...);
}
#定义abc(T1)u abc
模板void somefun(){
... 
abc(国际)(……);
abc(双倍)(……);
}

编辑:我的建议是,这种缩写根本不用宏。使用awoodlands解决方案或默认模板参数。而且你不应该使用保留名称。

很有趣,它很有效,但会让代码变得棘手和难以理解,因为它看起来像C风格的演员:)你要求的,你得到了;-)@user1386738:“它可以工作,但会使代码变得复杂和难以理解”适用于大多数(如果不是所有的话)宏。我不会使用宏,请完整键入它。它看起来很不自然,当它变老时,会把别人和你自己弄糊涂。此外,它存在于头文件中,可能会导致头文件之外的代码出现问题。