Re:What if anything have we learned from C++? [video]
by checker659 on Friday July 24, 2015 @05:45AM
(#9940936)
What about templates? For some reason, C programmers only seem to comment about the OO parts of C++ and never talk about templates. When you bring variadic templates into the mix, it's just more awesomeness.
And, before you mention it, use clang to avoid getting the page long templates related errors.
Re:What if anything have we learned from C++? [video]
by bluetomcat on Friday July 24, 2015 @06:19AM
(#9941031)
I haven't seen much template wizardry in the C++ codebases I've worked on. It can generally be seen in the standard headers.
Type-generic data containers can still be implemented with void pointers and very little runtime overhead, for example: http://lxr.nginx.org/source/src/core/ngx_array.h
Re:What if anything have we learned from C++? [video]
by detrino on Friday July 24, 2015 @07:35AM
(#9941234)
You cannot implement cache efficient data structures using void pointers.
Re:What if anything have we learned from C++? [video]
by f00fc0d3 on Friday July 24, 2015 @06:30AM
(#9941055)
C99 is nice, but C still lacks generic. I am not talking about C++ template nonsense, but not having to write max element search for every primitive type.
I am working in DSP project which was started with typical C++ OO BS, finally with ended up with C compiled as C++ + some simple templates for cases as above.
Re:What if anything have we learned from C++? [video]
by pjc50 on Friday July 24, 2015 @06:55AM
(#9941120)
C has a generic: "void *". It just doesn't have any type safety.
Re:What if anything have we learned from C++? [video]
by eutectic on Friday July 24, 2015 @08:17AM
(#9941396)
It also has bad performance if you need to pass function pointers around.
Re:What if anything have we learned from C++? [video]
by pjc50 on Friday July 24, 2015 @09:20AM
(#9941746)
Is this noticeably worse than calling through the vtable?
Re:What if anything have we learned from C++? [video]
by eots on Friday July 24, 2015 @10:16AM
(#9942118)
In C++ generics don't involve calling through a vtable.
Re:What if anything have we learned from C++? [video]
by ksherlock on Friday July 24, 2015 @08:26AM
(#9941432)
C11 has type generic macros. You can build your own with the _Generic statement.
int maxi(int, int);
double: maxd(double, double);
...
#define max(x) _Generic((x), int: maxi, double: maxd, ...default: maxi)
Re:What if anything have we learned from C++? [video]
by f00fc0d3 on Friday July 24, 2015 @09:32AM
(#9941824)
Yeah, but you still need to write those maxi, maxd :-(
Re:What if anything have we learned from C++? [video]
by stinos on Friday July 24, 2015 @06:48AM
(#9941099)
I am not talking about C++ template nonsense, but not having to write max element search for every primitive type
How is it template 'nonsense', when those templates do exactly that?
Re:What if anything have we learned from C++? [video]
by f00fc0d3 on Friday July 24, 2015 @07:27AM
(#9941197)
Template metaprograming is nonsense, not simple type substitution.
C++ templates are just too much, especially when mixed with substandard developers.
Re:What if anything have we learned from C++? [video]
by bluetomcat on Friday July 24, 2015 @06:42AM
(#9941080)
Using statement expressions and the typeof extension, you are able to write function-like, type-generic, scope-insensitive macros like this one:
#define MAX(a,b) ({ \
typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; \
})
The inability to write template functions can be compensated by designing your function so that it takes a function pointer where the type-specific action occurs.
Re:What if anything have we learned from C++? [video]
by nly on Friday July 24, 2015 @07:55AM
(#9941308)
Your MAX has no respect for namespaces or scopes. A real world macro is probably going to be called MYLIBRARY_MAX to avoid this. Secondly the C++ lambda solution is just easier to read.
auto max = [](auto a, auto b) {
return (a > b) ? a : b;
};
max (3.1415, 42); // returns double
max (42ul, 78u); // returns unsigned long
max (17, 16); // returns int
Re:What if anything have we learned from C++? [video]
by f00fc0d3 on Friday July 24, 2015 @07:25AM
(#9941194)
Typeof is not standard and many DSP compilers do not implement that.
Secondly I meant max search in array, not between to scalar values which is trivial. I really don't want to have for(...) inlined everywhere.
The "object-orientedness" of C++ really boils down to implicitly passing the this pointer to member functions, inheritance + virtual functions, and namespaces. All of these can be emulated in what I would call "C with discipline". Just be consistent in your naming conventions, always use a common prefix for globally visible functions and types, and use structs of function pointers whenever you really need virtual functions.