File tree Expand file tree Collapse file tree 6 files changed +76
-0
lines changed Expand file tree Collapse file tree 6 files changed +76
-0
lines changed Original file line number Diff line number Diff line change
1
+ #include " engine.h"
2
+
3
+ namespace vehicles {
4
+
5
+ struct vehicle ;
6
+
7
+ struct car_specs {
8
+ int power () const { return 100 ; }
9
+ };
10
+
11
+ car_specs engine_select_specs (vehicle *);
12
+
13
+ } // namespace vehicles
14
+
15
+ int car_power () { return engine::power<vehicles::vehicle>(); }
Original file line number Diff line number Diff line change
1
+ cl car.cc truck.cc vehicle_specs.cc /Fe" show.exe"
2
+ .\show
3
+ cl truck.cc car.cc vehicle_specs.cc /Fe" show.exe"
4
+ .\show
5
+ cl /DUSE_UNIQUE_TO_TRANSLATION_UNIT car.cc truck.cc vehicle_specs.cc /Fe" show.exe"
6
+ .\show
7
+ cl /DUSE_UNIQUE_TO_TRANSLATION_UNIT truck.cc car.cc vehicle_specs.cc /Fe" show.exe"
8
+ .\show
Original file line number Diff line number Diff line change
1
+ set -e
2
+ set -x
3
+ clang++ -std=c++11 car.cc truck.cc vehicle_specs.cc && ./a.out
4
+ clang++ -std=c++11 truck.cc car.cc vehicle_specs.cc && ./a.out
5
+ clang++ -std=c++11 -DUSE_UNIQUE_TO_TRANSLATION_UNIT car.cc truck.cc vehicle_specs.cc && ./a.out
6
+ clang++ -std=c++11 -DUSE_UNIQUE_TO_TRANSLATION_UNIT truck.cc car.cc vehicle_specs.cc && ./a.out
7
+ rm a.out
Original file line number Diff line number Diff line change
1
+ namespace engine {
2
+
3
+ #ifdef USE_UNIQUE_TO_TRANSLATION_UNIT
4
+
5
+ namespace {
6
+ struct unique_to_translation_unit {};
7
+ } // namespace
8
+
9
+ #define TTT template <typename T, typename U = unique_to_translation_unit>
10
+
11
+ #else
12
+
13
+ #define TTT template <typename T>
14
+
15
+ #endif
16
+
17
+ TTT using make_specs = decltype (engine_select_specs(static_cast <T *>(nullptr )));
18
+
19
+ TTT int power () { return make_specs<T>().power (); }
20
+
21
+ } // namespace engine
Original file line number Diff line number Diff line change
1
+ #include " engine.h"
2
+
3
+ namespace vehicles {
4
+
5
+ struct vehicle ;
6
+
7
+ struct truck_specs {
8
+ int power () const { return 300 ; }
9
+ };
10
+
11
+ truck_specs engine_select_specs (vehicle *);
12
+
13
+ } // namespace vehicles
14
+
15
+ int truck_power () { return engine::power<vehicles::vehicle>(); }
Original file line number Diff line number Diff line change
1
+ #include < iostream>
2
+
3
+ int car_power ();
4
+ int truck_power ();
5
+
6
+ int main () {
7
+ std::cout << " car power: " << car_power () << std::endl;
8
+ std::cout << " truck power: " << truck_power () << std::endl;
9
+ return 0 ;
10
+ }
You can’t perform that action at this time.
0 commit comments