@cyberpunk_は何かを達成しようとしていて、それについていくつか質問をしましたが、すべての追跡はこれに要約されます。
関数のコンパイル時評価を強制するツールを構築することは可能constexpr
ですか?
int f(int i) {return i;}
constexpr int g(int i) {return i;}
int main()
{
f(at_compilation(g, 0));
int x = at_compilation(g, 1);
constexpr int y = at_compilation(g, 2);
}
どのような状況でも、at_compilation
のコンパイル時の評価を強制しg
ます。
at_compilation
この形である必要はありません。
要件
- constexpr 関数の入力として任意の (数値ネイティブ) リテラル型を許可します。
- これは、関数の引数の型に基づいてハードコーディングすることもできます。
- constexpr 関数呼び出しの結果である任意の (数値ネイティブ) リテラル型を出力として許可します。
- これは、関数の戻り値の型に基づいてハードコーディングすることもできます。
望ましいもの
- マクロの使用を減らしましたが、使用することを恐れないでください。
- 一般的であること (ハードコーディングされていない型)。
- あらゆるリテラル型をサポートします。最後に、数値のネイティブ リテラル型は必須です。
関連する質問:
- コンパイル時に constexpr 関数が評価されるのはいつですか?
- コンパイル時に定数式を強制的に評価しますか?
- テンプレートパラメーターとして関数を渡しますか?
- C++11 標準のどこで、変換中に constexpr 関数をいつ評価できるかを指定していますか?
関連するコード サンプルによる回答:
すべてのコード サンプルには、要件に関する制限があります。
これが C++ ではどのように実行不可能であるかについての明確な説明も良い答えです。
@K-ballo / @Herb Sutter の「結果は定数式でも使用される」という回答に基づいて、それは不可能だと思います。これは、関数に関する私の以前の概念の一部ではありませんでしたconstexpr
。最初は、リテラル (またはその他のコンパイル時の入力) を引数として渡すだけで、(標準で) コンパイル時に評価されることを保証するのに十分であると考えました。
constexpr 関数の目的は、配列境界のように、必要に応じて定数式の状況に適合できることであると既に想定されています。それで大丈夫です。それを考えると、この質問は、コンパイル時間の計算のためのツールとしてそれらを使用することに関するハックに関するものです。それが良いことか悪いことかは問題ではありません。