📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

Wiki がページ「関数やクラスを個別にusingする方法(C++)」を「テクニック - 関数やクラスを個別にusingする方法(C++)」に、リダイレクトを残さずに移動しました
Wiki がページ「C++の基礎 -using」を「C++の基礎 - using」に、リダイレクトを残さずに移動しました
 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
ここでは、std::coutやstd::string等の省略記法(cout, string)を、using namespace std;を用いずに個別に利用可能にする方法を記載する。<br>
usingには、using宣言 (using declaration)、および、using指令 (using directive) の2つがある。<br>
型指定が可能なstd::vectorやstd::map等のテンプレートクラスも個別に宣言できる。<br>
<br>
<br>
ちなみに、usingディレクティブを用いてusing namespace std;と記述すれば、std名前空間の全てのメンバの省略記法が一括で利用可能になるが、<br>
これらは異なる用途で使用される。<br>
若干危険であるため(参考 : [http://marycore.jp/prog/cpp/de-using-namespace-std/ usingディレクティブ|using namespace std; の危険性と注意点・代替案])、個別に宣言する方法を推奨する。<br>
<br>
* using宣言
*: 特定の名前をスコープに導入する際に使用する。
*: 例えば、<code>using std::cout;</code>のように記述し、特定の要素のみを現在のスコープで使用可能にする。
*: <br>
* using指令
*: 名前空間全体をスコープに導入する際に使用する。
*: 例えば、<code>using namespace std;</code>のように記述し、指定した名前空間内の全ての要素を現在のスコープで使用可能にする。
<br>
これらの機能は、ソースコードの可読性と保守性の向上に寄与する。<br>
<br>
また、型指定が可能なstd::vectorやstd::map等のテンプレートクラスも個別に宣言することができる。<br>
<br>
<u>ちなみに、usingディレクティブを用いてusing namespace std;と記述すれば、std名前空間の全てのメンバの省略記法が一括で利用可能になるが、</u><br>
<u>若干危険であるため (参考 : [http://marycore.jp/prog/cpp/de-using-namespace-std/ usingディレクティブ|using namespace std; の危険性と注意点・代替案])、個別に宣言する方法を推奨する。</u><br>
<br><br>
<br><br>


10行目: 23行目:
using宣言(using declaration)によって、特定のメンバのみを取り込むことができる。<br>
using宣言(using declaration)によって、特定のメンバのみを取り込むことができる。<br>
クラススコープ以外の一般的なスコープで宣言が可能である。<br>
クラススコープ以外の一般的なスコープで宣言が可能である。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  using std::cout;
  using std::cout;
  using std::endl;
  using std::endl;
19行目: 32行目:
  // 新しい記述方法
  // 新しい記述方法
  cout << 123 << endl;
  cout << 123 << endl;
</source>
</syntaxhighlight>
<br>
<br>
関数の場合も同じ記法を用いる。<br>
関数の場合も同じ記法を用いる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  using std::max;
  using std::max;
  using std::sort;
  using std::sort;
  using std::move;
  using std::move;
  </source>
  </syntaxhighlight>
<br>
<br>
std::stringクラスの場合も変数の時と同様の記法が使用できる。<br>
std::stringクラスの場合も変数の時と同様の記法が使用できる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  using std::string;
  using std::string;
   
   
  string strhoge = "abcde";
  string strhoge = "abcde";
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== エイリアス宣言 ==
== エイリアス宣言 ==
std::vector<std::string>等のテンプレートクラスの場合には、エイリアス宣言(alias declaration)による別名での宣言が必要となる。<br>
std::vector<std::string>等のテンプレートクラスの場合には、エイリアス宣言(alias declaration)による別名での宣言が必要となる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  using String  = std::string;
  using String  = std::string;
  using strings = std::vector<std::string>;
  using strings = std::vector<std::string>;
   
   
  strings strvec = {"A", String("B")};
  strings strvec = {"A", String("B")};
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


== エイリアステンプレート ==
== エイリアステンプレート ==
エイリアステンプレート(alias templates)により、型指定が必要なテンプレートクラス(std::array<T>やunique_ptr<T>等)を別名で定義することもできる。<br>
エイリアステンプレート(alias templates)により、型指定が必要なテンプレートクラス(std::array<T>やunique_ptr<T>等)を別名で定義することもできる。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  template<typename T>
  template<typename T>
  using vector = std::vector<T>;
  using vector = std::vector<T>;
   
   
  vector<int> v = {1, 2, 3};
  vector<int> v = {1, 2, 3};
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


62行目: 75行目:
<br>
<br>
ただし、最も推奨するのは、必要になった時に局所的に定義する方法である。頻繁に使用しないクラスではこちらの方法がベストである。<br>
ただし、最も推奨するのは、必要になった時に局所的に定義する方法である。頻繁に使用しないクラスではこちらの方法がベストである。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  namespace mylib
  namespace mylib
  {
  {
92行目: 105行目:
     void hazard() { std::cout << endl; }
     void hazard() { std::cout << endl; }
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C++]]
[[カテゴリ:C++]]