質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • C++

    3021questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

c++コマンドライン引数const char*をconst intにキャストしたい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 152

long_long

score 3

 前提・実現したいこと

c++でコマンドライン引数const char*をconst intにキャストしたいです.
なぜならstd::bitsetの宣言時のテンプレート引数intをコマンドライン引数から指定したいためです.

 発生している問題・エラーメッセージ

$ g++ -o test test.cpp -std=gnu++17
test.cpp: In function ‘int main(int, const char**)’:
test.cpp:7:12: error: the value of ‘N’ is not usable in a constant expression
     bitset<N> bits;
            ^
test.cpp:6:21: note: ‘N’ was not initialized with a constant expression
     const int       N = atoi(argv[1]);
                     ^
test.cpp:7:13: error: the value of ‘N’ is not usable in a constant expression
     bitset<N> bits;
             ^
test.cpp:6:21: note: ‘N’ was not initialized with a constant expression
     const int       N = atoi(argv[1]);
                     ^
test.cpp:7:13: note: in template argument for type ‘long unsigned int’
     bitset<N> bits;

 該当のソースコード

#include <bitset>//ビット演算
using namespace std;

int main(int argc, const char *argv[]){
    //定数等の宣言
    const int       N = atoi(argv[1]);
    bitset<N> bits;

}

 試したこと

static_castによるconst intへのキャスト, atoiにconstexprの返り値がないか確認.

 補足情報(FW/ツールのバージョンなど)

$ g++ -dumpversion
5.4.0
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+4

std::bitsetの宣言時のテンプレート引数intをコマンドライン引数から指定したい

残念ながら実現不可能です。C++標準ライブラリstd::bitset<N>のビット長Nは、コンパイル時に確定する定数以外を受け付けません。

標準ライブラリではありませんが、Boostライブラリのboost::dynamic_bitsetが要件にぴったりだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/22 18:41

    早速のご回答有り難うございます.
    テンプレート引数とconstについて勘違いがあったようです.
    可変長のbitsetがあるのですね.代替のご提案ありがとうございます.bitsetのメソッドが便利で固定長を無理して利用しているところがあったので.早速利用してみようと思います.

    キャンセル

+2

こんにちは。

テンプレート・パラメータは、コンパイル時に値が決まっている必要があります。
ですので、実行時に値が決まるコマンドライン・パラメータを渡すことはできません。
そのケースではちょっとハマりやすいので要注意ですが、std::vector<bool>を使うのが妥当と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/22 18:44

    早速のご回答有り難うございます.

    テンプレート・パラメータについて知識不足だったようです.また,代替策のご提案ありがとうございます.お手数ですが,ハマりやすいというのはどういった点か教えていただけるでしょうか.

    キャンセル

  • 2018/04/22 19:10

    通常のstd::vector<T>のoperator[]やat()は、Tへの参照が返りますが、std::vector<bool>はそうではないです。https://cpprefjp.github.io/reference/vector.html
    ですので、boolへの参照が返ることを期待しているとハマります。

    キャンセル

  • 2018/04/23 00:16

    boolの場合だけ特殊化されているのですね.教えていただきありがとうございます.

    キャンセル

0

厳密な言語仕様は、知りませんが、、、、

"const int" へのキャストは可能なのでしようか?
const int の変数、、constなので、定数ですね。コンパイル時に確定する必要があります。従って、引数で指定した値を代入する事は出来ない筈です。

なお、const char ** については、関数に渡される変数(ポインタ)が定数を意味するため、問題はありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/04/22 18:41

    他の読者のために補足しておくと、

    >constなので、定数ですね

    constだけだとコンパイル時定数ではなく実行時定数ですね。コンパイル時定数によって初期化されている一部のconst変数(詳しい条件省略)とconstexpr指定されいているもののみがコンパイル時定数ですね。

    キャンセル

  • 2018/04/22 18:53 編集

    早速のご回答有り難うございます.

    テンプレート引数へはコンパイル時定数のみ入れることが出来るということですね.

    また,ポインタが定数として扱われていることについても教えていただいてありがとございます.

    キャンセル

  • 2018/04/23 00:12

    定数がいつの時点の定数なのか(プリプロセス時、コンパイル時、実行時)注意してみてください。

    キャンセル

  • 2018/04/23 00:19

    プリプロセス時とコンパイル時の差も気をつける必要があるのですね.勉強になります.今後意識してみようと思います.ありがとうございます.

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3021questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。