Skip to content

Commit bfcc24d

Browse files
authored
Merge pull request #676 from ckormanyos/modernization
Modernization
2 parents eac8cda + fe18a9e commit bfcc24d

17 files changed

Lines changed: 374 additions & 173 deletions

.github/workflows/real-time-cpp-snippets.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
- name: host-snippets-all
3131
run: |
3232
cd ${{ matrix.chapter }}
33-
./${{ matrix.chapter }}.sh ${{ matrix.compiler }} c++20
33+
./${{ matrix.chapter }}.sh ${{ matrix.compiler }} c++23
3434
working-directory: ./code_snippets
3535
host-snippets-chapter06:
3636
runs-on: ubuntu-latest

code_snippets/chapter03/chapter03.sh

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ ${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address
7070
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_21-001_span.cpp -o ./bin/chapter03_21-001_span.exe
7171
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_22-001_mersenne_twister_19937.cpp -o ./bin/chapter03_22-001_mersenne_twister_19937.exe
7272
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_22-002_test_random_engines.cpp -o ./bin/chapter03_22-002_test_random_engines.exe
73+
if [[ "${GCC}" == "g++" ]]; then
74+
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_23-001_expected_div_int.cpp -o ./bin/chapter03_23-001_expected_div_int.exe
75+
${GCC} -std=${STD} -Wall -Wextra -Wpedantic -Werror -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter03_23-002_expected_div_integral.cpp -o ./bin/chapter03_23-002_expected_div_integral.exe
76+
fi
7377

7478
if [[ "${GCC}" == "g++" ]]; then
7579
ls -la \
@@ -112,7 +116,9 @@ ls -la \
112116
./bin/chapter03_20-002_alias.exe \
113117
./bin/chapter03_21-001_span.exe \
114118
./bin/chapter03_22-001_mersenne_twister_19937.exe \
115-
./bin/chapter03_22-002_test_random_engines.exe
119+
./bin/chapter03_22-002_test_random_engines.exe \
120+
./bin/chapter03_23-001_expected_div_int.exe \
121+
./bin/chapter03_23-002_expected_div_integral.exe
116122
else
117123
ls -la \
118124
./bin/chapter03_01-001_declare_locals.exe \
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
///////////////////////////////////////////////////////////////////////////////
2+
// Copyright Christopher Kormanyos 2025.
3+
// Distributed under the Boost Software License,
4+
// Version 1.0. (See accompanying file LICENSE_1_0.txt
5+
// or copy at http://www.boost.org/LICENSE_1_0.txt)
6+
//
7+
8+
#include <expected>
9+
#include <iostream>
10+
11+
// chapter03_23-001_expected_div_int.cpp
12+
13+
enum class div_error
14+
{
15+
div_none,
16+
div_by_zero
17+
};
18+
19+
auto safe_divide(int a, int b) noexcept -> std::expected<int, div_error>
20+
{
21+
if (b == 0)
22+
{
23+
return std::unexpected(div_error::div_by_zero);
24+
}
25+
else
26+
{
27+
return a / b;
28+
}
29+
}
30+
31+
auto do_something() -> void
32+
{
33+
// Division by zero.
34+
auto result = safe_divide(10, 0);
35+
36+
if (result.error() == div_error::div_by_zero)
37+
{
38+
std::cout << "Division by zero" << std::endl;
39+
}
40+
else
41+
{
42+
std::cout << "Division ok, result: " << *result << std::endl;
43+
}
44+
45+
result = safe_divide(10, 2);
46+
47+
if (result.error() == div_error::div_by_zero)
48+
{
49+
std::cout << "Division by zero" << std::endl;
50+
}
51+
else
52+
{
53+
// Division ok, result: 5
54+
std::cout << "Division ok, result: " << *result << std::endl;
55+
}
56+
}
57+
58+
auto main() -> int
59+
{
60+
do_something();
61+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
///////////////////////////////////////////////////////////////////////////////
2+
// Copyright Christopher Kormanyos 2025.
3+
// Distributed under the Boost Software License,
4+
// Version 1.0. (See accompanying file LICENSE_1_0.txt
5+
// or copy at http://www.boost.org/LICENSE_1_0.txt)
6+
//
7+
8+
#include <expected>
9+
#include <iostream>
10+
11+
// chapter03_23-001_expected_div_int.cpp
12+
13+
enum class div_error
14+
{
15+
div_none,
16+
div_by_zero
17+
};
18+
19+
template<typename T>
20+
auto safe_divide(T a, T b)
21+
-> std::enable_if_t<std::is_integral_v<T>,
22+
std::expected<T, div_error>>
23+
{
24+
if (b == T { 0 })
25+
{
26+
return std::unexpected(div_error::div_by_zero);
27+
}
28+
else
29+
{
30+
return a / b;
31+
}
32+
}
33+
34+
auto do_something() -> void
35+
{
36+
// Division by zero.
37+
auto result = safe_divide(10U, 0U);
38+
39+
if (result.error() == div_error::div_by_zero)
40+
{
41+
std::cout << "Division by zero" << std::endl;
42+
}
43+
else
44+
{
45+
std::cout << "Division ok, result: " << *result << std::endl;
46+
}
47+
48+
result = safe_divide(10, 2);
49+
50+
if (result.error() == div_error::div_by_zero)
51+
{
52+
std::cout << "Division by zero" << std::endl;
53+
}
54+
else
55+
{
56+
// Division ok, result: 5
57+
std::cout << "Division ok, result: " << *result << std::endl;
58+
}
59+
}
60+
61+
auto main() -> int
62+
{
63+
do_something();
64+
}

code_snippets/chapter05/chapter05.sh

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,16 +36,18 @@ $GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion
3636
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_05-002_template_point.cpp -o ./bin/chapter05_05-002_template_point.exe
3737
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_05-003_template_point.cpp -o ./bin/chapter05_05-003_template_point.exe
3838
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-001_template_specialization.cpp -o ./bin/chapter05_06-001_template_specialization.exe
39-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-002_template_point.cpp -o ./bin/chapter05_06-002_template_point.exe
39+
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-002_template_enable_if.cpp -o ./bin/chapter05_06-002_template_enable_if.exe
40+
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-003_template_concepts.cpp -o ./bin/chapter05_06-003_template_concepts.exe
41+
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_06-004_template_point.cpp -o ./bin/chapter05_06-004_template_point.exe
4042
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_07-001_led_static_polymorphism.cpp -o ./bin/chapter05_07-001_led_static_polymorphism.exe
4143
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_08-001_using_the_stl.cpp -o ./bin/chapter05_08-001_using_the_stl.exe
4244
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_08-002_using_the_stl_algo.cpp -o ./bin/chapter05_08-002_using_the_stl_algo.exe
4345
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_08-003_std_for_each.cpp -o ./bin/chapter05_08-003_std_for_each.exe
4446
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_09-001_factory_simple.cpp -o ./bin/chapter05_09-001_factory_simple.exe
4547
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_09-002_factory_variadic_template.cpp -o ./bin/chapter05_09-002_factory_variadic_template.exe
4648
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-001_metaprogram_factorial.cpp -o ./bin/chapter05_10-001_metaprogram_factorial.exe
47-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-002_metaprogram_pow10.cpp -o ./bin/chapter05_10-002_metaprogram_pow10.exe
48-
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-003_metaprogram_inner_product.cpp -o ./bin/chapter05_10-003_metaprogram_inner_product.exe
49+
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-002_const_eval_pow10.cpp -o ./bin/chapter05_10-002_const_eval_pow10.exe
50+
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_10-003_const_eval_inner_product.cpp -o ./bin/chapter05_10-003_const_eval_inner_product.exe
4951
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_11-001_tuple_things_simple.cpp -o ./bin/chapter05_11-001_tuple_things_simple.exe
5052
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_11-002_tuple_things_metaprogram.cpp -o ./bin/chapter05_11-002_tuple_things_metaprogram.exe
5153
$GCC -std=$STD -Wall -Wextra -Wpedantic -Werror -Wconversion -Wsign-conversion -O3 -m64 -fsanitize=address -fsanitize=shift -fsanitize=shift-exponent -fsanitize=shift-base -fsanitize=integer-divide-by-zero -fsanitize=null -fsanitize=signed-integer-overflow -fsanitize=bounds -fsanitize=alignment -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fsanitize=enum ./chapter05_11-003_tuple_things_metaprogram.cpp -o ./bin/chapter05_11-003_tuple_things_metaprogram.exe
@@ -67,16 +69,18 @@ ls -la \
6769
./bin/chapter05_05-002_template_point.exe \
6870
./bin/chapter05_05-003_template_point.exe \
6971
./bin/chapter05_06-001_template_specialization.exe \
70-
./bin/chapter05_06-002_template_point.exe \
72+
./bin/chapter05_06-002_template_enable_if.exe \
73+
./bin/chapter05_06-003_template_concepts.exe \
74+
./bin/chapter05_06-004_template_point.exe \
7175
./bin/chapter05_07-001_led_static_polymorphism.exe \
7276
./bin/chapter05_08-001_using_the_stl.exe \
7377
./bin/chapter05_08-002_using_the_stl_algo.exe \
7478
./bin/chapter05_08-003_std_for_each.exe \
7579
./bin/chapter05_09-001_factory_simple.exe \
7680
./bin/chapter05_09-002_factory_variadic_template.exe \
7781
./bin/chapter05_10-001_metaprogram_factorial.exe \
78-
./bin/chapter05_10-002_metaprogram_pow10.exe \
79-
./bin/chapter05_10-003_metaprogram_inner_product.exe \
82+
./bin/chapter05_10-002_const_eval_pow10.exe \
83+
./bin/chapter05_10-003_const_eval_inner_product.exe \
8084
./bin/chapter05_11-001_tuple_things_simple.exe \
8185
./bin/chapter05_11-002_tuple_things_metaprogram.exe \
8286
./bin/chapter05_11-003_tuple_things_metaprogram.exe \
Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,34 @@
11
///////////////////////////////////////////////////////////////////////////////
2-
// Copyright Christopher Kormanyos 2017 - 2018.
2+
// Copyright Christopher Kormanyos 2017 - 2025.
33
// Distributed under the Boost Software License,
44
// Version 1.0. (See accompanying file LICENSE_1_0.txt
55
// or copy at http://www.boost.org/LICENSE_1_0.txt)
66
//
77

88
#include <iostream>
9+
#include <string>
910

1011
// chapter05_06-001_template_specialization.cpp
1112

12-
// The original add template function.
13+
// Generic add template function.
1314
template<typename T>
14-
T add(const T& a, const T& b)
15+
auto add(T a, T b) -> T
1516
{
1617
return a + b;
1718
}
1819

19-
// Make template specializations of add() with
20-
// easy-to-detect errors for float, double
21-
// and long double.
22-
23-
template<>
24-
float add<float>(const float&, const float&)
25-
{
26-
// Explicitly create an erroneous result!
27-
return 0.0F;
28-
}
29-
20+
// Specialize add() for the type int.
3021
template<>
31-
double add<double>(const double&, const double&)
22+
auto add<int>(int a, int b) -> int
3223
{
33-
// Explicitly create an erroneous result!
34-
return 0.0;
24+
return a + b;
3525
}
3626

37-
template<>
38-
long double add<long double>(const long double&,
39-
const long double&)
27+
auto main() -> int
4028
{
41-
// Explicitly create an erroneous result!
42-
return 0.0L;
43-
}
29+
// Add with generic template to get result "abcxyz".
30+
std::cout << add(std::string("abc"), std::string("xyz")) << std::endl;
4431

45-
int main()
46-
{
47-
// 3
32+
// Add with specialized template to get result 3.
4833
std::cout << add(1, 2) << std::endl;
49-
50-
// 0
51-
std::cout << add(1.0F, 2.0F) << std::endl;
5234
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
///////////////////////////////////////////////////////////////////////////////
2+
// Copyright Christopher Kormanyos 2017 - 2025.
3+
// Distributed under the Boost Software License,
4+
// Version 1.0. (See accompanying file LICENSE_1_0.txt
5+
// or copy at http://www.boost.org/LICENSE_1_0.txt)
6+
//
7+
8+
#include <iostream>
9+
10+
// chapter05_06-002_template_enable_if.cpp
11+
12+
// The original add template function.
13+
template<typename T>
14+
auto add(T a, T b) noexcept
15+
-> std::enable_if_t<!std::is_floating_point_v<T>, T>
16+
{
17+
return a + b;
18+
}
19+
20+
// Easy-to-detect errors for float, double
21+
// and long double.
22+
23+
template<typename T>
24+
auto add(T, T) noexcept
25+
-> std::enable_if_t<std::is_floating_point_v<T>, T>
26+
{
27+
// Explicitly create an erroneous result!
28+
return T { 0.0F };
29+
}
30+
31+
auto main() -> int;
32+
33+
auto main() -> int
34+
{
35+
// 3
36+
std::cout << add(1, 2) << std::endl;
37+
38+
// 0
39+
std::cout << add(1.0F, 2.0F) << std::endl;
40+
}

0 commit comments

Comments
 (0)