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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

3回答

1365閲覧

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

long_long

総合スコア12

C++

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

0グッド

1クリップ

投稿2018/04/22 09:25

前提・実現したいこと

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;

該当のソースコード

c++

1#include <bitset>//ビット演算 2using namespace std; 3 4int main(int argc, const char *argv[]){ 5 //定数等の宣言 6 const int N = atoi(argv[1]); 7 bitset<N> bits; 8 9}

試したこと

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

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

$ g++ -dumpversion 5.4.0

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

投稿2018/04/22 09:29

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

long_long

2018/04/22 09:41

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

0

こんにちは。

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

投稿2018/04/22 09:30

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

long_long

2018/04/22 09:44

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

2018/04/22 10:10

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

2018/04/22 15:16

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

0

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

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

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

投稿2018/04/22 09:33

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2018/04/22 09:41

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

2018/04/22 09:53 編集

早速のご回答有り難うございます. テンプレート引数へはコンパイル時定数のみ入れることが出来るということですね. また,ポインタが定数として扱われていることについても教えていただいてありがとございます.
yumetodo

2018/04/22 15:12

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

2018/04/22 15:19

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問