为类型,变量或命名空间创建新名称很容易.但是如何为函数指定新名称?例如,我想使用的名称holler进行printf.#define很明显......还有其他方式吗?
解决方案:
#define holler printfvoid (*p)() = fn; //function pointervoid (&r)() = fn; //function referenceinline void g(){ f(); }我一直都这么问,但我从来没有得到过一个非常好的答案; 我认为,在写第一个"Hello World"之前,几乎所有程序员都遇到过"宏不应该使用宏","宏是邪恶的"这样的短语等等,我的问题是:为什么?有了新的C++ 11,这么多年后还有一个真正的选择吗?
简单的部分是关于宏#pragma,特定于平台和特定于编译器,并且大多数时候它们具有严重的缺陷,例如#pragma once在至少两种重要情况下容易出错:不同路径中的相同名称以及一些网络设置和文件系统.
但总的来说,宏的用法和替代品呢?
您可以使用typedef为类型创建更短更简单的名称:
typedef std::chrono::high_resolution_clock Clock;
typedef Clock::time_point TimePoint;
typedef std::chrono::seconds Seconds;
typedef std::chrono::milliseconds Milliseconds;
Run Code Online (Sandbox Code Playgroud)
以及实例化的模板化类型:
typedef std::chrono::duration<float, std::ratio<1>> RealDuration;
// Example usage
float dt = RealDuration(a - b).count();
Run Code Online (Sandbox Code Playgroud)
对于函数指针:
typedef void (*FuncPtr)(int,int);
Run Code Online (Sandbox Code Playgroud)
您还可以为模板使用类型别名:
template<typename T> using uptr = std::unique_ptr<T>;
// Example usage
uptr<int> myInt;
uptr<foo> myFoo;
Run Code Online (Sandbox Code Playgroud)
但是如何创建一个模板函数的别名/指针?例如,如果我希望能够使用名称DurationCast来编写如下内容:
x = DurationCast<Seconds>(a - b);
y = DurationCast<Milliseconds>(c - d);
Run Code Online (Sandbox Code Playgroud)
需要做些什么来缩短函数std::chrono::duration_cast<T>(),DurationCast<T>()而不是简单地去using namespace std::chrono;或using std::chrono::duration_cast;路由,而不用编写我自己的函数对象来实现它?
编辑: 我想我可以写一个简单的包装器:
template<typename ToType, typename FromType>
ToType DurationCast(const FromType& d)
{
return …Run Code Online (Sandbox Code Playgroud) 我需要别名std::get功能,以提高我的代码的可读性.
不幸的是我遇到了编译时错误get<0> in namespace ‘std’ does not name a type.using相当于typedef它需要使用类型.我用a std::tuple来表示一些数据类型:
using myFoo = std::tuple<int,int,double,string>;
using getNumber = std::get<0>;
Run Code Online (Sandbox Code Playgroud)
我看一些以前的问题,但提出的解决方案是包装和使用std::forward.我不想为每个成员编写这样的代码.
有没有办法只使用关键字解决这个问题?
假设我在命名空间A中有一个模板函数.我还有另一个命名空间B.在命名空间A中声明了一个模板函数,定义为
template<typename T, typename U>
void f(T a, U b);
Run Code Online (Sandbox Code Playgroud)
现在在命名空间B中,我想要声明一个特殊类型的模板函数.我在想是否可以typedef使用模板函数,因此它在命名空间B中声明为
void f(int a, double b);
Run Code Online (Sandbox Code Playgroud)
没有实际实现调用模板函数的函数.由于有一种方法可以声明具有特定模板参数的新类型名称,所以不应该有办法用函数进行吗?我尝试了不同的方法来实现它,但它并没有完全解决.
那么在C++中是否已经有一种方法可以使用给定的模板参数重新声明该函数而无需实际实现新函数?如果没有,它在C++ 11中是否可以实现?
这将是一个很好的功能,因为它会使函数的目的更清晰,并在语法上更好:)
编辑:所以可以写:
using A::f<int, double>;
Run Code Online (Sandbox Code Playgroud)
在B名称空间中,该函数将显示这些模板参数
我知道,为了缩短课程名称,我可以做以下事情:
using Time = std::chrono::time_point<std::chrono::system_clock>;
using Clock = std::chrono::system_clock;
Run Code Online (Sandbox Code Playgroud)
但如何正确减少下一行的长度?
/*using Ms = */ std::chrono::duration_cast<std::chrono::milliseconds>
Run Code Online (Sandbox Code Playgroud)
目标代码:
Time start = Clock::now();
// something
Time end = Clock::now();
std::cout << Ms(end - start).count() << std::endl;
Run Code Online (Sandbox Code Playgroud) 是否有可能std::get
在类似的东西中“别名” as
,它会给出类似的东西bool v = as<bool>(my_variant);
来自C++11:如何为函数添加别名?我很清楚我们不能使用using函数模板,因为函数模板不是类型。
来自C++ 如何创建指向重载模板函数的函数指针我知道函数指针只能从特定的模板实例化创建。
所以我倾向于说这是不可能的,但也许我错了?