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