C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++17の新機能


C ++標準委員会は、常に3年ごとに新機能を出荷することに重点を置いています。仕様の2つの主要な部分は、プログラミング言語のコア機能と標準テンプレートライブラリ(STL)です。新しい機能は、コードをよりクリーンで、より簡単で、コンパクトにするために導入されました。導入される機能のリストは次のとおりです-:

1。折りたたみ式

フォールド式は、関数に渡すことも、関数から返すこともできる可変数の引数の短いコードを記述するために使用されます。これにより、引数として、および関数のreturnステートメントで任意の数の変数を使用できます。

構文:-

  • 単項右折り-(pack op1 ...)

  • 単項左折り-(…op1パック)

  • バイナリ左フォールド-(initop1…op1pack)

  • バイナリ右折り-(packop1…op1init)

ここにパック は、任意の数の変数に対して拡張できるパラメーターパックです。 op1 は演算子です。 (-、+、<=、> =、<、>、==、*、/…。)。バイナリフォールドでは、両方のop1は同じ演算子です。

init 展開できない表現です。

#include <iostream>
#include <string>
using namespace std;
template<typename ...Args> auto addition(Args ...args){
   return (args + ... + 0);
}
template<typename ...Args> auto sum2(Args ...args){
   return (args + ...);
}
int main(){
   cout << "Sum is : "<<addition(1,1,1,1,1) << endl;
   cout << "Sum 2 is : "<<addition ( 1,2,3);
}

出力

Sum is : 5
Sum 2 is : 6

2。構造バインディング

これらは、ペア、タプルなどの値で初期化される複数の変数を宣言するために使用されます。これらすべての変数と初期化子のバインドは、単一のステートメントで実行されます。

  • ケース1:-配列のバインド

    識別子リストの各識別子は、配列の要素の左辺値の名前になります。要素の数は、識別子の数と同じである必要があります。

    int arry [3] ={3,4,5};

    auto [a、b、c] =arry;

    //ここで配列が作成され、aは3を参照し、bは4を参照し、cは5を参照します。

  • ケース2:-タイプのようなタプルをバインドする

    float fnum {};

    char ch1 {};

    int番号{};

    std ::tuple tplex(fnum、std ::move(ch1)、number);

    const auto&[p、q、r] =tplex;

    //pはfnumを参照する構造化バインディングの名前です

    //qはch1を参照する構造化バインディングの名前です

    //rは番号を参照する構造化バインディングの名前です

  • ケース3:-データメンバーへのバインド

    struct structVar {

    可変intnum1:2;

    volatile double num2;

    };

    structVar func();

    const auto [a、b] =func();

    //aは2ビットビットフィールドの整数値です

    //bはconstvolatiledouble lvalue

3。ダイレクトリストを使用した列挙型の初期化

C ++ 17では、列挙型を中括弧を使用して初期化できるようになりました。

構文:-

enum byte : unsigned char {};
byte b0 {0}; // OK
byte b1 = byte{1}; // OK
byte b2 = byte{256}; // ERROR - 0 to 255 only

4。 IfとSwitch内の変数宣言

C ++ 17では、ifおよびswitch条件内で変数を宣言できます。これにより、スコープが異なる同じ名前の変数を簡単に使用できます。

構文:-

if (data type variable condition)
{
   //statements
}
switch ( condition; variable )
{
   //statements
}

5。 constexprステートメントの場合

テンプレートコードに役立つ機能。 ifconstexprステートメントはコンパイル時に評価されます。

いかがですか

以下の比較を使用して、役立つことを示すことができます:-

一般的なIf-elseステートメント:-

int var = 10;
if (var >= 10) {
   var=var+10;
} else {
   var=var-10;
}

Constexpr If-elseステートメント:-

template <typename T>
auto length ( T const& value ) { 
   //checking if T is integer or not
   if (is_integral<T>::value) {
      return value;
   } else {
      return value.length();
   }
}

6。ネストされた名前空間

名前空間は、相関するクラスや関数などの類似したコードをグループ化するために使用されます。 C ++ 17では、ネストされた名前空間を使用する構文がより簡単になります。以前は、ネストされた名前空間の数が多いと、構文がかなり乱雑になりました。中かっこを処理する必要がなくなりました。

C ++ 17より前:-

namespace Earth{

   namespace Continent {
      namespace Country {
         class City {
         ..........
}; } } }

新しい構文:-

namespace Earth :: Continent :: Country {
   class City {
      ..........
}; }

  1. Twitter が新しいタイムライン機能を公開

    レースに参加するために、Twitterは新機能を追加し続けており、これに関して、新しいタイムライン機能が展開されると言われています.このタイムライン機能により、ストーリーに関するすべてのツイートが 1 つのバナーの下に表示されるため、ユーザーはさまざまな視点を簡単に確認できます。 平均的なユーザーは、インターフェースがややわかりにくいため、Twitter を使用するのに苦労しています。これが、Twitter が脚光を浴びることができない理由です。したがって、物事を機能させるために、Twitter はすべてのユーザーに役立つ新しい機能を明らかにしました。 ユーザーが留守中に投稿の要約を確認で

  2. Facebook がイメージチェンジし、新機能を発表!

    ここ数か月は、Facebook が非常に大きな危機に直面し、人々が Facebook を削除するようになったため、厳しい状況でした。ケンブリッジ・アナリティカの訴訟に対する反発にもかかわらず、フェイスブックのCEOであるマーク・ザッカーバーグは、ソーシャルメディアプラットフォームの未来に楽観的な見通しを持って前進している.彼は、カリフォルニア州サンノゼで開催された F8 Developer Conference のステージに上がり、F8 を呼び出して、Facebook とその子会社に追加されるいくつかの新機能を発表しました。 「私たちには取り組むべき本当の課題がありますが、その楽観的な感覚も