天道酬勤,学无止境

typedef

Does a typedef to self have any effect?

I've come across some C++ code that has the following: typedef Request Request; Is this just a no-op or does this typedef actual have an effect, and if so, what effect does it have?

2022-06-05 21:00:09    分类:问答    c++   typedef   self   noop

Is it allowed to typedef a class template type argument into the same name?

问题 template <typename EnumType> struct Enum { // There are two hard problems in CS: cache invalidation and naming things. typedef EnumType EnumType; }; 回答1 我认为类型定义是不允许的。 14.6.1 本地声明的名称 (N4296) 6 模板参数不得在其范围内重新声明(包括嵌套范围)。模板参数不得与模板名称同名。 [ 例子: 模板<class T, int i> 类 Y { 诠释T; // 错误:模板参数重新声明 无效 f() { 图表; // 错误:模板参数重新声明 } }; 模板<类 X> 类 X; // 错误:模板参数重新声明 —结束示例] typedef EnumType EnumType是将模板参数重新定义为 typedef-name。

2022-05-14 13:10:05    分类:技术分享    c++   templates   typedef

Documenting C++ aliases in Doxygen

问题 在前面加上适当的注释后,Doxygen 会为class 、 struct和namespace声明生成条目,但不会生成typedef或using 。 在这个例子中 /// here is my typedef typedef int MyTypedef; /// here is my namespace namespace MyNamespace { /// here is my other typedef typedef int MyOtherTypedef; } 我在MyNamespace甚至MyOtherTypedef的文档中获得了一个条目,但MyTypedef没有任何内容。 为什么不? 回答1 答案与为什么不自动生成函数和预处理器定义的条目的答案相同。 Doxygen 将别名、变量、函数和宏(但不是类或命名空间)视为“对象”。 并且所有“对象”都记录在案,前提是它们的包含文件、类或命名空间也记录在案。 要使MyTypedef出现在您的文档中,请添加: /// \file /// here is my file 文件全局范围内的任何位置。

2022-05-12 19:45:04    分类:技术分享    c++   alias   doxygen   typedef   using

Creating Objects from type alias in Scala [duplicate]

问题 这个问题在这里已经有了答案: 从 Scala 中的类型参数创建对象1 个答案 1 年前关闭。 如何从 scala 中的类型别名构造对象? type MyType = List[Int] println(List[Int]()) println(MyType()) // error: not found: value MyType 这在必须返回该类型的新实例的函数中是有问题的。 基本示例: def foo(x: MyType): MyType = { if (x.head == 0) MyType() // Should Nil be used? else if (x.head == -1) new MyType(1,2,3,4) else x } foo怎么会不知道MyType的实际类型? 回答1 Scala(如 Java)对类型和值有不同的命名空间,类型别名只是将别名引入类型命名空间。 在某些情况下,您可以将别名与引用伴随对象的val配对以获得您正在寻找的效果: scala> case class Foo(i: Int) defined class Foo scala> type MyType = Foo defined type alias MyType scala> val MyType = Foo MyType: Foo.type = Foo scala>

2022-05-09 11:59:05    分类:技术分享    scala   typedef

typedef array type in C

问题 typedef int arr[10] 我了解上述语句为 int[10] 定义了一个新名称,以便 arr intArray; 相当于 int intArray[10]; 但是,我对这样做的惯例感到困惑。 在我看来,这 typedef int arr[10] 令人困惑,对我来说一个明确的方法是 typedef int[10] arr 即,我将“int[10]”定义为一种名为 arr 的新类型 但是,编译器不接受这一点。 请问为什么? 它只是 C 语言的约定吗? 回答1 C 的早期版本没有typedef关键字。 当它被添加到语言中时(1978 年之前的某个时间),它必须以与现有语法一致的方式完成。 在语法上,关键字typedef被视为存储类说明符,就像extern或static一样,尽管它的含义完全不同。 所以就像你可能写的那样: static int arr[10]; 你会写: typedef int arr[10]; 将typedef声明视为类似于对象声明的东西。 不同之处在于它创建的标识符(在本例中为arr )是类型名称而不是对象名称。 回答2

2022-05-08 05:55:09    分类:技术分享    c   arrays   typedef

Format specifiers for implementation-defined types like time_t

问题 ... time_t t = time(NULL); printf("%s", t); ... 回答1 通常,您可以使用强制转换将操作数转换为您知道正确格式的某种类型。 您提出的解决方案: time_t t = time(NULL); printf("%s", t); 显然不起作用,因为time_t是数字类型,而不是char* 。 我们知道,一般来说, time_t是一种算术类型。 像这样的东西: printf("%ld\n", (long)t); 可能适用于大多数系统。 它可能会失败(a)如果time_t是不宽于unsigned long的无符号类型并且t的当前值超过LONG_MAX ,或者(b)如果time_t是浮点类型。 如果你有 C99 支持,你可以使用long long ,这样会好一点: printf("%lld\n", (long long)t); 如果您真的想在可移植性方面做得过火,您可以检测time_t是哪种类型: if ((time_t)-1 > 0) { // time_t is an unsigned type printf("%ju\n", (uintmax_t)t); } else if ((time_t)1 / 2 > 0) { // time_t is a signed integer type printf("%jd\n", (intmax_t

2022-05-06 11:59:25    分类:技术分享    c   printf   typedef   time-t

In a C++ template class, can I typedef the template parameter using the same name?

问题 如果我有一个模板类: template<typename Layout> class LayoutHandler : Handler { }; 我想将参数 Layout 暴露给类的用户。 然后: template<typename Layout> class LayoutHandler : Handler { public: typedef Layout Layout; // using the same name }; VS2012 可以编译这段代码,并给出预期的结果。 (我使用 std::is_same 来检查它。)这在标准 C++03 或 C++11 中是否允许? 回答1 在 C++11 中是不允许的。 typedef是一个声明。 (见第 7.1.3 节) template参数不能在其范围内重新声明(包括嵌套范围)。 (见第 14.6.1.6 节) C++11 草案标准 n3242 回答2 在 C+11 之前你不能使用它,它会给你一个错误。 'typedef Layout LayoutHandler::Layout' 错误声明:shadows template parm 'class Layout'

2022-05-05 19:08:05    分类:技术分享    c++   templates   typedef

In a C++ template class, can I typedef the template parameter using the same name?

If I have a template class: template<typename Layout> class LayoutHandler : Handler { }; and I want to expose the parameter Layout to the user of the class. Then: template<typename Layout> class LayoutHandler : Handler { public: typedef Layout Layout; // using the same name }; VS2012 can compile this code, and give the expected result. (I use std::is_same to check it.) Is this allowed in standard C++03 or C++11?

2022-05-03 02:50:53    分类:问答    c++   templates   typedef

Is it allowed to typedef a class template type argument into the same name?

This seems to compile and even work as expected in MSVC. But is it legal C++ code and is it guaranteed to do what is expected here (that is, export the template type to the struct's users under the same name)? template <typename EnumType> struct Enum { // There are two hard problems in CS: cache invalidation and naming things. typedef EnumType EnumType; };

2022-05-02 21:35:58    分类:问答    c++   templates   typedef

Variadic template to define a typedef (using C++11)

问题 我刚刚定义了 4 个不同的 typedef,差异很小,我想知道是否有办法使用模板来更有效地做到这一点。 我的 typedef 的形式是: typedef Type1 (*pf)(Type2, Type3, ...) 我如何模板这个typedef? 只有Type1是必需的。 我手动写: typedef int (*pf)(int) typedef bool (*pf)() typedef char (*pf)(bool, int) 我正在寻找类似的东西: template <Type T1,Type...Rest> typedef T1 (*pf)(Type...Rest) 那是对的吗? 回答1 是的,当然,两行(根据您的代码风格可能是单行): template<class T, class... X> using fptr_t = T (*)(X...); 这采用了一种称为alias template的技术:http://en.cppreference.com/w/cpp/language/type_alias 别名模板在某种意义上类似于类模板,它没有定义新类型(就像类型别名一样),而是定义了一个用于定义新类型的模板。 当与不同类型一起使用时,它为您提供基于此模板的类型定义。 这是 C++11 的特性。 回答2 #include <iostream> namespace

2022-05-02 07:50:06    分类:技术分享    c++   templates   typedef