Skip to content

Commit 4da4c4e

Browse files
committed
Add power_less(), more_power_less()
``` $ ./compile_and_run.sh ++ clang++ -std=c++11 unknown.cc car.cc truck.cc vehicle_specs.cc ++ ./a.out unknown power: 0 car power: 0 100 truck power: 0 300 car power: 1 100 truck power: 1 100 car power: 2 100 truck power: 2 100 ++ clang++ -std=c++11 unknown.cc truck.cc car.cc vehicle_specs.cc ++ ./a.out unknown power: 0 car power: 0 100 truck power: 0 300 car power: 1 300 truck power: 1 300 car power: 2 300 truck power: 2 300 ++ rm a.out ```
1 parent e3a3561 commit 4da4c4e

File tree

4 files changed

+36
-8
lines changed

4 files changed

+36
-8
lines changed

caster_odr_specs_scope/car.cc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ struct specs_scope<vehicles::vehicle, unique_to_translation_unit> {
2323

2424
} // namespace engine
2525

26-
int car_power() {
27-
return engine::power<vehicles::vehicle, engine::unique_to_translation_unit>();
26+
int car_power(int i) {
27+
if (i == 0) {
28+
return engine::power<vehicles::vehicle,
29+
engine::unique_to_translation_unit>();
30+
}
31+
if (i == 1) {
32+
return engine::power_less<vehicles::vehicle>();
33+
}
34+
return engine::more_power_less<vehicles::vehicle>();
2835
}

caster_odr_specs_scope/engine.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,16 @@ int power() {
2424
return make_specs<T, typename specs_scope<T, U>::select>().power();
2525
}
2626

27+
template <typename T>
28+
int power_less() { // Violates the ODR.
29+
return make_specs<
30+
T, typename specs_scope<T, unique_to_translation_unit>::select>()
31+
.power();
32+
}
33+
34+
template <typename T>
35+
int more_power_less() { // This, too, transitively.
36+
return power_less<T>();
37+
}
38+
2739
} // namespace engine

caster_odr_specs_scope/truck.cc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ struct specs_scope<vehicles::vehicle, unique_to_translation_unit> {
2323

2424
} // namespace engine
2525

26-
int truck_power() {
27-
return engine::power<vehicles::vehicle, engine::unique_to_translation_unit>();
26+
int truck_power(int i) {
27+
if (i == 0) {
28+
return engine::power<vehicles::vehicle,
29+
engine::unique_to_translation_unit>();
30+
}
31+
if (i == 1) {
32+
return engine::power_less<vehicles::vehicle>();
33+
}
34+
return engine::more_power_less<vehicles::vehicle>();
2835
}
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
#include <iostream>
22

33
int unknown_power();
4-
int car_power();
5-
int truck_power();
4+
int car_power(int i);
5+
int truck_power(int i);
66

77
int main() {
88
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;
9+
for (int i = 0; i < 3; i++) {
10+
std::cout << "car power: " << i << " " << car_power(i) << std::endl;
11+
std::cout << "truck power: " << i << " " << truck_power(i) << std::endl;
12+
}
1113
return 0;
1214
}

0 commit comments

Comments
 (0)