File tree Expand file tree Collapse file tree 7 files changed +115
-0
lines changed
Expand file tree Collapse file tree 7 files changed +115
-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+ } // namespace vehicles
12+
13+ namespace engine {
14+
15+ template <>
16+ struct make_specs <vehicles::vehicle, unique_to_translation_unit>
17+ : vehicles::car_specs {};
18+
19+ template <>
20+ struct specs_scope <vehicles::vehicle, unique_to_translation_unit> {
21+ using select = unique_to_translation_unit;
22+ };
23+
24+ } // namespace engine
25+
26+ int car_power () {
27+ return engine::power<vehicles::vehicle, engine::unique_to_translation_unit>();
28+ }
Original file line number Diff line number Diff line change 1+ cl unknown.cc car.cc truck.cc vehicle_specs.cc /Fe" show.exe"
2+ .\show
3+ cl unknown.cc truck.cc car.cc vehicle_specs.cc /Fe" show.exe"
4+ .\show
Original file line number Diff line number Diff line change 1+ set -e
2+ set -x
3+ clang++ -std=c++11 unknown.cc car.cc truck.cc vehicle_specs.cc && ./a.out
4+ clang++ -std=c++11 unknown.cc truck.cc car.cc vehicle_specs.cc && ./a.out
5+ rm a.out
Original file line number Diff line number Diff line change 1+ namespace engine {
2+
3+ namespace {
4+ struct unique_to_translation_unit {};
5+ } // namespace
6+
7+ struct external_specs_scope {};
8+
9+ template <typename T>
10+ struct specs {
11+ int power () const { return 0 ; }
12+ };
13+
14+ template <typename T, typename S>
15+ struct make_specs : specs<T> {};
16+
17+ template <typename T, typename U>
18+ struct specs_scope {
19+ using select = external_specs_scope;
20+ };
21+
22+ template <typename T, typename U>
23+ int power () {
24+ return make_specs<T, typename specs_scope<T, U>::select>().power ();
25+ }
26+
27+ } // 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+ } // namespace vehicles
12+
13+ namespace engine {
14+
15+ template <>
16+ struct make_specs <vehicles::vehicle, unique_to_translation_unit>
17+ : vehicles::truck_specs {};
18+
19+ template <>
20+ struct specs_scope <vehicles::vehicle, unique_to_translation_unit> {
21+ using select = unique_to_translation_unit;
22+ };
23+
24+ } // namespace engine
25+
26+ int truck_power () {
27+ return engine::power<vehicles::vehicle, engine::unique_to_translation_unit>();
28+ }
Original file line number Diff line number Diff line change 1+ #include " engine.h"
2+
3+ namespace vehicles {
4+
5+ struct vehicle ;
6+
7+ }
8+
9+ int unknown_power () {
10+ return engine::power<vehicles::vehicle, engine::unique_to_translation_unit>();
11+ }
Original file line number Diff line number Diff line change 1+ #include < iostream>
2+
3+ int unknown_power ();
4+ int car_power ();
5+ int truck_power ();
6+
7+ int main () {
8+ std::cout << " unknown power: " << unknown_power () << std::endl;
9+ std::cout << " car power: " << car_power () << std::endl;
10+ std::cout << " truck power: " << truck_power () << std::endl;
11+ return 0 ;
12+ }
You can’t perform that action at this time.
0 commit comments