2023-11-24 18:33:21 +01:00
<!doctype html>
< html lang = "en" dir = "ltr" class = "docs-wrapper plugin-docs plugin-id-cpp docs-version-current docs-doc-page docs-doc-id-exceptions-and-raii/2023-11-24-placeholders" data-has-hydrated = "false" >
< head >
< meta charset = "UTF-8" >
< meta name = "generator" content = "Docusaurus v3.0.0" >
< title data-rh = "true" > Placeholders | mf< / title > < meta data-rh = "true" name = "viewport" content = "width=device-width,initial-scale=1" > < meta data-rh = "true" name = "twitter:card" content = "summary_large_image" > < meta data-rh = "true" property = "og:url" content = "https://blog.mfocko.xyz/cpp/exceptions-and-raii/placeholders/" > < meta data-rh = "true" property = "og:locale" content = "en" > < meta data-rh = "true" name = "docusaurus_locale" content = "en" > < meta data-rh = "true" name = "docsearch:language" content = "en" > < meta data-rh = "true" name = "docusaurus_version" content = "current" > < meta data-rh = "true" name = "docusaurus_tag" content = "docs-cpp-current" > < meta data-rh = "true" name = "docsearch:version" content = "current" > < meta data-rh = "true" name = "docsearch:docusaurus_tag" content = "docs-cpp-current" > < meta data-rh = "true" property = "og:title" content = "Placeholders | mf" > < meta data-rh = "true" name = "description" content = "Placeholders that are quite convenient to use when working on the code .
">< meta data-rh = "true" property = "og:description" content = "Placeholders that are quite convenient to use when working on the code .
">< link data-rh = "true" rel = "icon" href = "/img/favicon.ico" > < link data-rh = "true" rel = "canonical" href = "https://blog.mfocko.xyz/cpp/exceptions-and-raii/placeholders/" > < link data-rh = "true" rel = "alternate" href = "https://blog.mfocko.xyz/cpp/exceptions-and-raii/placeholders/" hreflang = "en" > < link data-rh = "true" rel = "alternate" href = "https://blog.mfocko.xyz/cpp/exceptions-and-raii/placeholders/" hreflang = "x-default" > < link data-rh = "true" rel = "preconnect" href = "https://0VXRFPR4QF-dsn.algolia.net" crossorigin = "anonymous" > < link rel = "search" type = "application/opensearchdescription+xml" title = "mf" href = "/opensearch.xml" >
< link rel = "alternate" type = "application/rss+xml" href = "/blog/rss.xml" title = "mf RSS Feed" >
< link rel = "alternate" type = "application/atom+xml" href = "/blog/atom.xml" title = "mf Atom Feed" >
< link rel = "alternate" type = "application/json" href = "/blog/feed.json" title = "mf JSON Feed" >
< link rel = "stylesheet" href = "https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css" integrity = "sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM" crossorigin = "anonymous" > < link rel = "stylesheet" href = "/assets/css/styles.0f577c26.css" >
2023-11-25 21:52:07 +01:00
< script src = "/assets/js/runtime~main.9b3960c4.js" defer = "defer" > < / script >
< script src = "/assets/js/main.2d5ce640.js" defer = "defer" > < / script >
2023-11-24 18:33:21 +01:00
< / head >
< body class = "navigation-with-keyboard" >
< script > ! function ( ) { function t ( t ) { document . documentElement . setAttribute ( "data-theme" , t ) } var e = function ( ) { try { return new URLSearchParams ( window . location . search ) . get ( "docusaurus-theme" ) } catch ( t ) { } } ( ) || function ( ) { try { return localStorage . getItem ( "theme" ) } catch ( t ) { } } ( ) ; t ( null !== e ? e : "light" ) } ( ) , function ( ) { try { const c = new URLSearchParams ( window . location . search ) . entries ( ) ; for ( var [ t , e ] of c ) if ( t . startsWith ( "docusaurus-data-" ) ) { var a = t . replace ( "docusaurus-data-" , "data-" ) ; document . documentElement . setAttribute ( a , e ) } } catch ( t ) { } } ( ) < / script > < div id = "__docusaurus" > < div role = "region" aria-label = "Skip to main content" > < a class = "skipToContent_fXgn" href = "#__docusaurus_skipToContent_fallback" > Skip to main content< / a > < / div > < nav aria-label = "Main" class = "navbar navbar--fixed-top" > < div class = "navbar__inner" > < div class = "navbar__items" > < button aria-label = "Toggle navigation bar" aria-expanded = "false" class = "navbar__toggle clean-btn" type = "button" > < svg width = "30" height = "30" viewBox = "0 0 30 30" aria-hidden = "true" > < path stroke = "currentColor" stroke-linecap = "round" stroke-miterlimit = "10" stroke-width = "2" d = "M4 7h22M4 15h22M4 23h22" > < / path > < / svg > < / button > < a class = "navbar__brand" href = "/" > < b class = "navbar__title text--truncate" > mf< / b > < / a > < div class = "navbar__item dropdown dropdown--hoverable" > < a href = "#" aria-haspopup = "true" aria-expanded = "false" role = "button" class = "navbar__link" > Additional FI MU materials< / a > < ul class = "dropdown__menu" > < li > < a class = "dropdown__link" href = "/algorithms/" > Algorithms< / a > < / li > < li > < a class = "dropdown__link" href = "/c/" > C< / a > < / li > < li > < a aria-current = "page" class = "dropdown__link dropdown__link--active" href = "/cpp/" > C++< / a > < / li > < / ul > < / div > < a class = "navbar__item navbar__link" href = "/contributions/" > Contributions< / a > < a class = "navbar__item navbar__link" href = "/talks/" > Talks< / a > < / div > < div class = "navbar__items navbar__items--right" > < a class = "navbar__item navbar__link" href = "/blog/" > Blog< / a > < div class = "toggle_vylO colorModeToggle_DEke" > < button class = "clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type = "button" disabled = "" title = "Switch between dark and light mode (currently light mode)" aria-label = "Switch between dark and light mode (currently light mode)" aria-live = "polite" > < svg viewBox = "0 0 24 24" width = "24" height = "24" class = "lightToggleIcon_pyhR" > < path fill = "currentColor" d = "M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z" > < / path > < / svg > < svg viewBox = "0 0 24 24" width = "24" height = "24" class = "darkToggleIcon_wfgR" > < path fill = "currentColor" d = "M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z" > < / path > < / svg > < / button > < / div > < div class = "navbarSearchContainer_Bca1" > < button type = "button" class = "DocSearch DocSearch-Button" aria-label = "Search" > < span class = "DocSearch-Button-Container" > < svg width = "20" height = "20" class = "DocSearch-Search-Icon" viewBox = "0 0 20 20" > < path d = "M14.386 14 . 386l4 . 0877 4 . 0877-4 . 0877-4 . 0877c-2 .
languages, but I miss them in the C++. I' m taking the inspiration from languages
like Rust (all that we will implement) or Kotlin (< code > TODO< / code > ) that have them
implemented.< / p >
< p > You may ask what placeholders do we need in the code, in our case we will be
talking about TODOs and unexpected situations, such as not implemented branches.< / p >
< p > Namely we will implement< / p >
< ul >
< li > < code > todo< / code > ,< / li >
< li > < code > unimplemented< / code > , and< / li >
< li > < code > unreachable< / code > .< / li >
< / ul >
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = "design" > Design< a href = "#design" class = "hash-link" aria-label = "Direct link to Design" title = "Direct link to Design" > < / a > < / h2 >
< p > If we take the two languages mentioned above as examples, there are at least two
ways how to implement them:< / p >
< ol >
< li > < em > panic< / em > when they are reached (as they do in Rust), or< / li >
< li > < em > raise< / em > an exception when they are reached (as they do in Kotlin).< / li >
< / ol >
< p > I will choose raising an exception, since the closest equivalent of < em > panic< / em > in
C++ would be < code > assert< / code > s that are (by default) disabled in the < em > release builds< / em > .< / p >
< p > However I am too lazy to do:< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token keyword" style = "color:#00009f" > throw< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:#999988;font-style:italic" > // or< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > throw< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token string" style = "color:#e3116c" > " optional note" < / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < br > < / span > < / code > < / pre > < div class = "buttonGroup__atx" > < button type = "button" aria-label = "Copy code to clipboard" title = "Copy" class = "clean-btn" > < span class = "copyButtonIcons_eSgA" aria-hidden = "true" > < svg viewBox = "0 0 24 24" class = "copyButtonIcon_y97N" > < path fill = "currentColor" d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" > < / path > < / svg > < svg viewBox = "0 0 24 24" class = "copyButtonSuccessIcon_LjdS" > < path fill = "currentColor" d = "M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" > < / path > < / svg > < / span > < / button > < / div > < / div > < / div >
2023-11-24 18:33:21 +01:00
< p > Therefore we will implement exceptions and also wrap them in functions, so that
we can do:< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token function" style = "color:#d73a49" > todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token comment" style = "color:#999988;font-style:italic" > // or< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token string" style = "color:#e3116c" > " optional note" < / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < br > < / span > < / code > < / pre > < div class = "buttonGroup__atx" > < button type = "button" aria-label = "Copy code to clipboard" title = "Copy" class = "clean-btn" > < span class = "copyButtonIcons_eSgA" aria-hidden = "true" > < svg viewBox = "0 0 24 24" class = "copyButtonIcon_y97N" > < path fill = "currentColor" d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" > < / path > < / svg > < svg viewBox = "0 0 24 24" class = "copyButtonSuccessIcon_LjdS" > < path fill = "currentColor" d = "M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" > < / path > < / svg > < / span > < / button > < / div > < / div > < / div >
2023-11-24 18:33:21 +01:00
< div class = "theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success" > < div class = "admonitionHeading_Gvgb" > < span class = "admonitionIcon_Rf37" > < svg viewBox = "0 0 12 16" > < path fill-rule = "evenodd" d = "M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z" > < / path > < / svg > < / span > tip< / div > < div class = "admonitionContent_BuS1" > < p > Wrapping them in a function (or macro) will allow us to do a little magic trick.< / p > < / div > < / div >
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = "implementation" > Implementation< a href = "#implementation" class = "hash-link" aria-label = "Direct link to Implementation" title = "Direct link to Implementation" > < / a > < / h2 >
< p > We' re going to utilize the exceptions, so we' ll need to include the < code > exception< / code >
header and we will start with a simple < code > _todo< / code > exception class.< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > < exception> < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > < string> < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" style = "display:inline-block" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > class< / span > < span class = "token plain" > < / span > < span class = "token class-name" > _todo< / span > < span class = "token plain" > < / span > < span class = "token operator" style = "color:#393A34" > :< / span > < span class = "token plain" > < / span > < span class = "token base-clause keyword" style = "color:#00009f" > public< / span > < span class = "token base-clause" > std< / span > < span class = "token base-clause double-colon punctuation" style = "color:#393A34" > ::< / span > < span class = "token base-clause class-name" > exception< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > std< / span > < span class = "token double-colon punctuation" style = "color:#393A34" > ::< / span > < span class = "token plain" > string cause< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" style = "display:inline-block" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > public< / span > < span class = "token operator" style = "color:#393A34" > :< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > _todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token operator" style = "color:#393A34" > :< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > cause< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token string" style = "color:#e3116c" > " not yet implemented" < / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token punctuation" style = "color:#393A34" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > _todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token plain" > std< / span > < span class = "token double-colon punctuation" style = "color:#393A34" > ::< / span > < span class = "token plain" > string< / span > < span class = "token operator" style = "color:#393A34" > & & < / span > < span class = "token plain" > excuse< / span > < span class = "toke
2023-11-24 18:33:21 +01:00
< p > In this case we have 2 constructors:< / p >
< ol >
< li > default constructor without any parameters that will return just
< code > not yet implemented< / code > < / li >
< li > and one parametrized with an “excuse” that will return string like:
< code > not yet implemented: ‹ excuse› < / code > < / li >
< / ol >
< p > If we were to use it now, we would need to do something like:< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > " placeholders.hpp" < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" style = "display:inline-block" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > main< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > throw< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > _todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > return< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:#36acaa" > 0< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > }< / span > < br > < / span > < / code > < / pre > < div class = "buttonGroup__atx" > < button type = "button" aria-label = "Copy code to clipboard" title = "Copy" class = "clean-btn" > < span class = "copyButtonIcons_eSgA" aria-hidden = "true" > < svg viewBox = "0 0 24 24" class = "copyButtonIcon_y97N" > < path fill = "currentColor" d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" > < / path > < / svg > < svg viewBox = "0 0 24 24" class = "copyButtonSuccessIcon_LjdS" > < path fill = "currentColor" d = "M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" > < / path > < / svg > < / span > < / button > < / div > < / div > < / div >
2023-11-24 18:33:21 +01:00
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = "wrapping-in-a-function" > Wrapping in a function< a href = "#wrapping-in-a-function" class = "hash-link" aria-label = "Direct link to Wrapping in a function" title = "Direct link to Wrapping in a function" > < / a > < / h2 >
< p > I am a lazy person, so we will wrap the exception in a function that will throw
it:< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token keyword" style = "color:#00009f" > void< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > throw< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > _todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > }< / span > < br > < / span > < / code > < / pre > < div class = "buttonGroup__atx" > < button type = "button" aria-label = "Copy code to clipboard" title = "Copy" class = "clean-btn" > < span class = "copyButtonIcons_eSgA" aria-hidden = "true" > < svg viewBox = "0 0 24 24" class = "copyButtonIcon_y97N" > < path fill = "currentColor" d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" > < / path > < / svg > < svg viewBox = "0 0 24 24" class = "copyButtonSuccessIcon_LjdS" > < path fill = "currentColor" d = "M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" > < / path > < / svg > < / span > < / button > < / div > < / div > < / div >
2023-11-24 18:33:21 +01:00
< p > This can be used like:< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > " placeholders.hpp" < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" style = "display:inline-block" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > int< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > main< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > return< / span > < span class = "token plain" > < / span > < span class = "token number" style = "color:#36acaa" > 0< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > }< / span > < br > < / span > < / code > < / pre > < div class = "buttonGroup__atx" > < button type = "button" aria-label = "Copy code to clipboard" title = "Copy" class = "clean-btn" > < span class = "copyButtonIcons_eSgA" aria-hidden = "true" > < svg viewBox = "0 0 24 24" class = "copyButtonIcon_y97N" > < path fill = "currentColor" d = "M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z" > < / path > < / svg > < svg viewBox = "0 0 24 24" class = "copyButtonSuccessIcon_LjdS" > < path fill = "currentColor" d = "M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z" > < / path > < / svg > < / span > < / button > < / div > < / div > < / div >
2023-11-24 18:33:21 +01:00
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = "magic-trick" > Magic trick< a href = "#magic-trick" class = "hash-link" aria-label = "Direct link to Magic trick" title = "Direct link to Magic trick" > < / a > < / h2 >
< p > At the beginning I' ve mentioned that by wrapping the exceptions in a helper
functions that will throw them, we can do a nice magic trick <!-- --> 😄<!-- --> This trick
will consist of formatted string and for that we will use
< a href = "https://en.cppreference.com/w/cpp/utility/format/format" target = "_blank" rel = "noopener noreferrer" > < code > std::format< / code > < / a > that is
available since C++20.< / p >
< p > We just need to add one more overload for our < code > todo()< / code > :< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > < format> < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" style = "display:inline-block" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > template< / span > < span class = "token operator" style = "color:#393A34" > < < / span > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > class< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token plain" > Args < / span > < span class = "token operator" style = "color:#393A34" > > < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > void< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token plain" > std< / span > < span class = "token double-colon punctuation" style = "color:#393A34" > ::< / span > < span class = "token plain" > format_string< / span > < span class = "token operator" style = "color:#393A34" > < < / span > < span class = "token plain" > Args< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token operator" style = "color:#393A34" > > < / span > < span class = "token plain" > fmt< / span > < span class = "token punctuation" style = "color:#393A34" > ,< / span > < span class = "token plain" > Args< / span > < span class = "token operator" style = "color:#393A34" > & & < / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token plain" > args< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > throw< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > _todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token plain" > std< / span > < span class = "token double-colon punctuation" style = "color:#393A34" > ::< / span > < span class = "token function" style = "color:#d73a49" > format< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token plain" > fmt< / span > < span class = "token punctuation" style = "color:#393A34" > ,< / span > < span class = "token plain" > args< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > .< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < /
2023-11-24 18:33:21 +01:00
< h2 class = "anchor anchorWithStickyNavbar_LWe7" id = "finishing-off-with-2-more-exceptions" > Finishing off with 2 more exceptions< a href = "#finishing-off-with-2-more-exceptions" class = "hash-link" aria-label = "Direct link to Finishing off with 2 more exceptions" title = "Direct link to Finishing off with 2 more exceptions" > < / a > < / h2 >
< p > Now we can repeat the same process for the other two exceptions I' ve mentioned< / p >
< ul >
< li > < code > unimplemented< / code > , and< / li >
< li > < code > unreachable< / code > .< / li >
< / ul >
< p > In the end we should end up with something like this:< / p >
2023-11-25 21:52:07 +01:00
< div class = "language-cpp codeBlockContainer_Ckt0 theme-code-block" style = "--prism-color:#393A34;--prism-background-color:#f6f8fa" > < div class = "codeBlockContent_biex" > < pre tabindex = "0" class = "prism-code language-cpp codeBlock_bY9V thin-scrollbar" style = "color:#393A34;background-color:#f6f8fa" > < code class = "codeBlockLines_e6Vv" > < span class = "token-line" style = "color:#393A34" > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > < exception> < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > < format> < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token macro property directive-hash" style = "color:#36acaa" > #< / span > < span class = "token macro property directive keyword" style = "color:#00009f" > include< / span > < span class = "token macro property" style = "color:#36acaa" > < / span > < span class = "token macro property string" style = "color:#e3116c" > < string> < / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" style = "display:inline-block" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > class< / span > < span class = "token plain" > < / span > < span class = "token class-name" > _todo< / span > < span class = "token plain" > < / span > < span class = "token operator" style = "color:#393A34" > :< / span > < span class = "token plain" > < / span > < span class = "token base-clause keyword" style = "color:#00009f" > public< / span > < span class = "token base-clause" > std< / span > < span class = "token base-clause double-colon punctuation" style = "color:#393A34" > ::< / span > < span class = "token base-clause class-name" > exception< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > std< / span > < span class = "token double-colon punctuation" style = "color:#393A34" > ::< / span > < span class = "token plain" > string cause< / span > < span class = "token punctuation" style = "color:#393A34" > ;< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" style = "display:inline-block" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token keyword" style = "color:#00009f" > public< / span > < span class = "token operator" style = "color:#393A34" > :< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393A34" > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > _todo< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token operator" style = "color:#393A34" > :< / span > < span class = "token plain" > < / span > < span class = "token function" style = "color:#d73a49" > cause< / span > < span class = "token punctuation" style = "color:#393A34" > (< / span > < span class = "token string" style = "color:#e3116c" > " not yet implemented" < / span > < span class = "token punctuation" style = "color:#393A34" > )< / span > < span class = "token plain" > < / span > < span class = "token punctuation" style = "color:#393A34" > {< / span > < span class = "token punctuation" style = "color:#393A34" > }< / span > < span class = "token plain" > < / span > < br > < / span > < span class = "token-line" style = "color:#393
2023-11-24 18:33:21 +01:00
< div class = "theme-admonition theme-admonition-info admonition_xJq3 alert alert--info" > < div class = "admonitionHeading_Gvgb" > < span class = "admonitionIcon_Rf37" > < svg viewBox = "0 0 14 16" > < path fill-rule = "evenodd" d = "M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z" > < / path > < / svg > < / span > info< / div > < div class = "admonitionContent_BuS1" > < p > Final source code: < a href = "/files/cpp/exceptions-and-raii/placeholders/placeholders.hpp" target = "_blank" rel = "noopener noreferrer" > < code > placeholders.hpp< / code > < / a > < / p > < / div > < / div > < / div > < footer class = "theme-doc-footer docusaurus-mt-lg" > < div class = "theme-doc-footer-edit-meta-row row" > < div class = "col" > < a href = "https://github.com/mfocko/blog/tree/main/cpp/07-exceptions-and-raii/2023-11-24-placeholders.md" target = "_blank" rel = "noopener noreferrer" class = "theme-edit-this-page" > < svg fill = "currentColor" height = "20" width = "20" viewBox = "0 0 40 40" class = "iconEdit_Z9Sw" aria-hidden = "true" > < g > < path d = "m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z" > < / path > < / g > < / svg > Edit this page< / a > < / div > < div class = "col lastUpdated_vwxv" > < span class = "theme-last-updated" > Last updated<!-- --> on < b > < time datetime = "2023-11-24T00:00:00.000Z" > Nov 24, 2023< / time > < / b > < / span > < / div > < / div > < / footer > < / article > < nav class = "pagination-nav docusaurus-mt-lg" aria-label = "Docs pages" > < a class = "pagination-nav__link pagination-nav__link--prev" href = "/cpp/category/exceptions-and-raii/" > < div class = "pagination-nav__sublabel" > Previous< / div > < div class = "pagination-nav__label" > Exceptions and RAII< / div > < / a > < a class = "pagination-nav__link pagination-nav__link--next" href = "/cpp/environment/" > < div class = "pagination-nav__sublabel" > Next< / div > < div class = "pagination-nav__label" > Environment< / div > < / a > < / nav > < / div > < / div > < div class = "col col--3" > < div class = "tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop" > < ul class = "table-of-contents table-of-contents__left-border" > < li > < a href = "#design" class = "table-of-contents__link toc-highlight" > Design< / a > < / li > < li > < a href = "#implementation" class = "table-of-contents__link toc-highlight" > Implementation< / a > < / li > < li > < a href = "#wrapping-in-a-function" class = "table-of-contents__link toc-highlight" > Wrapping in a function< / a > < / li > < li > < a href = "#magic-trick" class = "table-of-contents__link toc-highlight" > Magic trick< / a > < / li > < li > < a href = "#finishing-off-with-2-more-exceptions" class = "table-of-contents__link toc-highlight" > Finishing off with 2 more exceptions< / a > < / li > < / ul > < / div > < / div > < / div > < / div > < / main > < / div > < / div > < / div > < footer class = "footer footer--dark" > < div class = "container container-fluid" > < div class = "row footer__links" > < div class = "col footer__col" > < div class = "footer__title" > Git< / div > < ul class = "footer__items clean-list" > < li class = "footer__item" > < a href = "https://github.com/mfocko" target = "_blank" rel = "noopener noreferrer" class = "footer__link-item" > GitHub< svg width = "13.5" height = "13.5" aria-hidden = "true" viewBox = "0 0 24 24" class = "iconExternalLink_nPIU" > < path fill = "currentColor" d = "M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z" > < / path > < / svg > < / a > < / li > < li class = "footer__item" > < a href = "https://gitlab.com/mfocko" target = "_blank" rel = "noopener noreferrer" class = "footer__link-item" > GitLab< svg width = "13.5" height = "13.5" aria-hidden = "true" viewBox = "0 0 24 24" class = "iconExternalLink_nPIU" > < path fill = "currentColor" d = "M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z" > < / path > < / svg > < / a > < / li > < li class = "footer__item" > < a href = "https://git.mfocko.xyz/mfocko" target = "_blank" rel = "noopener noreferrer" class = "footer__link-item" > Gitea (self-hosted)< svg width = "13.5" height = "13.5" aria-hidden = "true" viewBox = "0 0 24 24" class = "iconExternalLink_nPIU" > < path fill = "currentColor" d = "M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z" > < / path > < / svg > < / a > < / li >
< / body >
< / html >