C++14 – Göze çarpanlar

C++14 – Lambda fonksiyonlarında yakalanan ifadelerde ilk değer

C++11 ile gelen özelliklerden biri olan lambda ifadelerinde içinde olduğu bilinirlik alanından value-copy veya reference ile değişkenler, lambda fonksiyonunun gövdesine enjekte edilebiliyordu.

C++14 teki değişiklik ile bu değişkenlere başlangıç değeri de verilebilmekte bu da aslında std::move edilebilmelerinin önünü açıyor.

#include <iostream>
#include <iomanip>


using namespace std;

int main()
{
    int i = 10;
    auto lambda1 = [i = 5] () {
         cout << i << endl;
    };

    lambda1();

    std::unique_ptr ptr(new int(10));
    auto lambda2 = [value = std::move(ptr)] {return *value;};

    cout << lambda2() << endl;

    return 0;
}

C++14 – Variable Template – Değişken şablonları

C++11 de gelen variadic templatelerle derleme zamanında iyi işler çıkarabiliyorduk. C++14’te derleme zamanına değişken şablonlar da (variable template) eklendi. Baya da hoş oldu 🙂

#include <iostream>
#include <iomanip>


using namespace std;

template
constexpr T pi = T( 3.14159265358979323);

template
constexpr const char* pi = "pi";

int main()
{

    cout << setprecision(20);
    cout << pi << endl;
    cout << pi << endl;

    return 0;
}

C++14 – [[deprecated]]
Deprecated olan neredeyse herşeyin bildirimi için C++14 standartlarında dile eklenen özelliktir.


#include <iostream>

using namespace std;

[[deprecated]] int f();

class [[deprecated]] my_class {
public:
    [[deprecated]] int member;
};

[[deprecated]] int i;

enum [[deprecated]] colors{
    RED, BLUE, BLACK
};


[[deprecated]]
typedef int type;

template  class templ;

template 
class [[deprecated]] templ {};

[[deprecated("g() is thread-unsafe. Use h() instead")]]
void g( int& x );

void h( int& x );

int main()
{

    int a = f(); // warning: 'f' is deprecated
    g(a); // warning: 'g' is deprecated: g() is thread-unsafe. Use h() instead
    my_class my;

    return 0;
}

Bu şekilde bildirimi yapılmış fonksiyonların, sınıfların, değişkenleri v.b kullanımı derleyici tarafından uyarı mesajları alınmasına sebep olur.

C++14 – Generic Lambdalar
C++11 ile gelen anonymous fonksiyonlar oluşturmamızı sağlayan lambdalar, C++14 ile birlikte auto anahtar sözcüğünün kullanımı sayesinde daha genel olarak tanımlanabilirler. Örneğin;

#include <iostream>
#include <vector>

using namespace std;

int main()
{

    vector ivec = {1, 2, 4, 4, 5, 6, 7, 8, 2, 8};

    //C++11
    auto printVec11 = [] (std::vector &vec) {
        for (auto i : vec)
            cout << i << " ";
    };

    //C++14
    auto printVec14 = [] (auto &vec) {
        for (auto i : vec)
            cout << i << " ";
    };

    printVec11(ivec);
    cout << "\n";
    printVec14(ivec);

    return 0;
}
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s