Skip to content

Commit e3a3561

Browse files
committed
Add caster_odr_specs_scope experiment.
Another way to leverage unique_to_translation_unit.
1 parent 17e15f5 commit e3a3561

File tree

7 files changed

+115
-0
lines changed

7 files changed

+115
-0
lines changed

caster_odr_specs_scope/car.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
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
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
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

caster_odr_specs_scope/engine.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
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

caster_odr_specs_scope/truck.cc

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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+
}

caster_odr_specs_scope/unknown.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
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+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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+
}

0 commit comments

Comments
 (0)