「C++の基礎 - using」の版間の差分

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動
(Wiki がページ「関数やクラスを個別にusingする方法(C++)」を「テクニック - 関数やクラスを個別にusingする方法(C++)」に、リダイレクトを残さずに移動しました)
(文字列「</source>」を「</syntaxhighlight>」に置換)
19行目: 19行目:
  // 新しい記述方法
  // 新しい記述方法
  cout << 123 << endl;
  cout << 123 << endl;
</source>
</syntaxhighlight>
<br>
<br>
関数の場合も同じ記法を用いる。<br>
関数の場合も同じ記法を用いる。<br>
26行目: 26行目:
  using std::sort;
  using std::sort;
  using std::move;
  using std::move;
  </source>
  </syntaxhighlight>
<br>
<br>
std::stringクラスの場合も変数の時と同様の記法が使用できる。<br>
std::stringクラスの場合も変数の時と同様の記法が使用できる。<br>
33行目: 33行目:
   
   
  string strhoge = "abcde";
  string strhoge = "abcde";
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


43行目: 43行目:
   
   
  strings strvec = {"A", String("B")};
  strings strvec = {"A", String("B")};
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


53行目: 53行目:
   
   
  vector<int> v = {1, 2, 3};
  vector<int> v = {1, 2, 3};
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


92行目: 92行目:
     void hazard() { std::cout << endl; }
     void hazard() { std::cout << endl; }
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


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

2021年11月24日 (水) 18:06時点における版

概要

ここでは、std::coutやstd::string等の省略記法(cout, string)を、using namespace std;を用いずに個別に利用可能にする方法を記載する。
型指定が可能なstd::vectorやstd::map等のテンプレートクラスも個別に宣言できる。

ちなみに、usingディレクティブを用いてusing namespace std;と記述すれば、std名前空間の全てのメンバの省略記法が一括で利用可能になるが、
若干危険であるため(参考 : usingディレクティブ|using namespace std; の危険性と注意点・代替案)、個別に宣言する方法を推奨する。


using宣言

using宣言(using declaration)によって、特定のメンバのみを取り込むことができる。
クラススコープ以外の一般的なスコープで宣言が可能である。

<source lang="c++">
using std::cout;
using std::endl;

// 以前の記述方法
std::cout << 123 << std::endl;

// 新しい記述方法
cout << 123 << endl;

</syntaxhighlight>
関数の場合も同じ記法を用いる。

<source lang="c++">
using std::max;
using std::sort;
using std::move;
</syntaxhighlight>


std::stringクラスの場合も変数の時と同様の記法が使用できる。

<source lang="c++">
using std::string;

string strhoge = "abcde";
</syntaxhighlight>



エイリアス宣言

std::vector<std::string>等のテンプレートクラスの場合には、エイリアス宣言(alias declaration)による別名での宣言が必要となる。

<source lang="c++">
using String  = std::string;
using strings = std::vector<std::string>;

strings strvec = {"A", String("B")};
</syntaxhighlight>



エイリアステンプレート

エイリアステンプレート(alias templates)により、型指定が必要なテンプレートクラス(std::array<T>やunique_ptr<T>等)を別名で定義することもできる。

<source lang="c++">
template<typename T>
using vector = std::vector<T>;

vector<int> v = {1, 2, 3};
</syntaxhighlight>



usingの活用方法

これらのusing宣言 / エイリアス宣言 / エイリアステンプレートによる個別の宣言と定義をどのタイミングで行うべきか、
using namespace std;の代替として使用するのであれば、ファイルスコープへの汚染を慎重に考慮した上で、
従来通り、main関数の外や実装ファイルの冒頭で利用するのもよい。

ただし、最も推奨するのは、必要になった時に局所的に定義する方法である。頻繁に使用しないクラスではこちらの方法がベストである。

<source lang="c++">
namespace mylib
{
   // 名前空間で個別に宣言(mylib内限定で利用可能)
   using std::cout;

   void test()
   {
      // 関数内で個別に宣言
      using std::endl;

      cout << 1 << endl;
      cout << 2 << endl;
   }

   struct String
   {
      // クラス内で個別に定義
      using string = std::string;

      string _str;
      String(const char* str) : _str(str) {}
      void print() { cout << _str << std::endl; }
   };

   // 下記に示す無名の名前空間の場合、同一の名前空間に汚染するので注意する
   namespace { using std::endl; }
   // 侵食したendlが使えてしまう
   void hazard() { std::cout << endl; }
}
</syntaxhighlight>