Programlama dili: C ++ 26'da yansıma | Haberler Online
Almanca yansıma veya yansıma, bir programın yapısını ve davranışını inceleme, düşünme ve değiştirme yeteneğidir.
C ++ 'daki yansıma daha fazladır. İşte teklifin iki ifadesi (P2996R5).
Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
“Sadece programın yapısını gözlemlemek istemiyoruz: bu gözlemlere bağlı kod üretimini kolaylaştırmak istiyoruz. Bu kombinasyon bir şekilde “yansıtıcı hedefin programlanması” olarak adlandırılır, ancak Tartışma WID21'de “yansıma” terimi, maymun genellikle aynı genel fikri ifade etmek için gayri resmi olarak kullanılır.“
“Bu teklif, yansıma programlaması ve derleme meta programı ile ilgili son oyun olmaya mahkum değildir. Bunun yerine, daha güçlü özelliklerin zamanla artış eklemek istediği yararlı bir çekirdek olacağını planlıyoruz. Özellikle, P1240R2'de keşfedilen kalan özelliklerin veya tüm özelliklerin ve kod enjeksiyonunun (tarif edilen satırlar boyunca [P2237R0]) Takip edilecek arzu edilen endikasyonlardır.“
Tarih
C ++ yansımının geçmişi, meta modelinin programlanmasına dayanmaktadır. Model hedefinin programlanması 1994 civarında başladı ve yansıma. C ++ 98, çalışma zamanının (RTTI) yansımasını ve fonksiyonel modelin tezahürünü aldı. C ++ 11'deki veri türleri kitapçısı C ++ 'nın becerilerini geliştirdi. C ++ 26'da muhtemelen genel bir yansıma desteği alacağız.
Stratejim
Beni P2996R5 teklifinde destekleyeceğim ve C ++ 26'da yansıma sunduğumda örnekleri kullanacağım.
Her şeyden önce, gramer unsurlarına yansıma değerinden ileri geri atlamak istiyorum.
Dilbilgisi Yansıma değeri
Aşağıdaki program dilbilgisi alanında başlar, yansıma alanına ve yine dilbilgisel alanda atlar.
// forthAndBack.cpp (P2996R5)
#include <iostream>
#include <cassert>
#include <concepts>
int main() {
constexpr auto r = ^int;
typename[:r:] x = 42; // Same as: int x = 42;
typename[:^char:] c = '*'; // Same as: char c = '*';
static_assert(std::same_as<decltype(x), int>);
static_assert(std::same_as<decltype(c), char>);
assert(x == 42);
assert(c == '*');
}
Dilbilgisi ve yansıma alanları arasındaki sıçrama çok az mantıklı. İşte programın daha kesin bir analizi enumString.cpp:
Enum sicim
Enum => dize
Aşağıdaki örnek, bir numaralı değeri bir dizeye dönüştürür:
// enumString.cpp
#include <iostream>
#include <experimental/meta>
#include <string>
#include <type_traits>
template<typename E>
requires std::is_enum_v<E> // (1)
constexpr std::string enum_to_string(E value) {
std::string result = "<unnamed>";
[:expand(std::meta::enumerators_of(^E)):] >> // (2)
[&]<auto e>{
if (value == [:e:]) {
result = std::meta::identifier_of(e); // (3)
}
};
return result;
}
int main() {
std::cout << 'n';
enum Color { red, green, blue };
std::cout << "enum_to_string(Color::red): " << enum_to_string(Color::red) << 'n';
// std::cout << "enum_to_string(42): " << enum_to_string(42) << 'n';
std::cout << 'n';
}
(1) 'de veri türünün sahipliğini kullanarak kullanılır std::is_enum Kontrol edilip value Bir numaralandırıcı. İfade ^E (2) 'de yansımanın değerini yaratır. İşlev expand Aynı satırı görmezden gelebilirsiniz. Mevcut uygulamada genişleme talimatları eksiktir.
İşlevler std::meta::enumerators_of VE std::meta::enumerators_of (2) ve (3) 'de hedef işlevlerdir. Sadece derleme sırasında gerçekleştirilebilirler çünkü consteval İlan edilirler.
İşte bazı hedef işler.
namespace std::meta {
consteval auto members_of(info type_class) -> vector<info>;
consteval auto bases_of(info type_class) -> vector<info>;
consteval auto static_data_members_of(info type_class) -> vector<info>;
consteval auto nonstatic_data_members_of(info type_class) -> vector<info>;
consteval auto subobjects_of(info type_class) -> vector<info> {
auto subobjects = bases_of(type_class);
subobjects.append_range(nonstatic_data_members_of(type_class));
return subobjects;
}
consteval auto enumerators_of(info type_enum) -> vector<info>;
}
Tüm meta işlevler bir tane verir std::vector Geriye doğru. Yansıma, veri türlerini analiz etmek ve kod oluşturmak için birçok hedef eser sunar.
Enum h3>
Dizeden ters pasajların uygulanması bir enum yapar:
template <typename E>
requires std::is_enum_v<E>
constexpr std:
ptional<E> string_to_enum(std::string_view name) {
template for (constexpr auto e : std::meta::enumerators_of(^E)) {
if (name == std::meta::identifier_of(e)) {
return [:e:];
}
}
return std::nullopt;
}
Sırada ne var?
Yansıma birçok hedef işlevi sunar. Bir sonraki makalemde kullanacağım.
(RME)
Programlama Dili: C ++ 26'da yansıma
Almanca yansıma veya yansıma, bir programın yapısını ve davranışını inceleme, düşünme ve değiştirme yeteneğidir.

C ++ 'daki yansıma daha fazladır. İşte teklifin iki ifadesi (P2996R5).

Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.
“Sadece programın yapısını gözlemlemek istemiyoruz: bu gözlemlere bağlı kod üretimini kolaylaştırmak istiyoruz. Bu kombinasyon bir şekilde “yansıtıcı hedefin programlanması” olarak adlandırılır, ancak Tartışma WID21'de “yansıma” terimi, maymun genellikle aynı genel fikri ifade etmek için gayri resmi olarak kullanılır.“
“Bu teklif, yansıma programlaması ve derleme meta programı ile ilgili son oyun olmaya mahkum değildir. Bunun yerine, daha güçlü özelliklerin zamanla artış eklemek istediği yararlı bir çekirdek olacağını planlıyoruz. Özellikle, P1240R2'de keşfedilen kalan özelliklerin veya tüm özelliklerin ve kod enjeksiyonunun (tarif edilen satırlar boyunca [P2237R0]) Takip edilecek arzu edilen endikasyonlardır.“
Tarih
C ++ yansımının geçmişi, meta modelinin programlanmasına dayanmaktadır. Model hedefinin programlanması 1994 civarında başladı ve yansıma. C ++ 98, çalışma zamanının (RTTI) yansımasını ve fonksiyonel modelin tezahürünü aldı. C ++ 11'deki veri türleri kitapçısı C ++ 'nın becerilerini geliştirdi. C ++ 26'da muhtemelen genel bir yansıma desteği alacağız.
Stratejim
Beni P2996R5 teklifinde destekleyeceğim ve C ++ 26'da yansıma sunduğumda örnekleri kullanacağım.
Her şeyden önce, gramer unsurlarına yansıma değerinden ileri geri atlamak istiyorum.
Dilbilgisi Yansıma değeri
Aşağıdaki program dilbilgisi alanında başlar, yansıma alanına ve yine dilbilgisel alanda atlar.
// forthAndBack.cpp (P2996R5)
#include <iostream>
#include <cassert>
#include <concepts>
int main() {
constexpr auto r = ^int;
typename[:r:] x = 42; // Same as: int x = 42;
typename[:^char:] c = '*'; // Same as: char c = '*';
static_assert(std::same_as<decltype(x), int>);
static_assert(std::same_as<decltype(c), char>);
assert(x == 42);
assert(c == '*');
}
- ^: Reflexionsoperator operandosundan bir yansıma değeri yaratır (^int VE ^char)))
- [: refl :]: Splicer bir yansıma değerinden dilbilgisi bir unsur oluşturur ([:r:] VE [:^char:])))
- Reflexionswert Sürekli bir ifade olarak programın öğelerinin bir temsilidir
Dilbilgisi ve yansıma alanları arasındaki sıçrama çok az mantıklı. İşte programın daha kesin bir analizi enumString.cpp:
Enum sicim
Enum => dize
Aşağıdaki örnek, bir numaralı değeri bir dizeye dönüştürür:
// enumString.cpp
#include <iostream>
#include <experimental/meta>
#include <string>
#include <type_traits>
template<typename E>
requires std::is_enum_v<E> // (1)
constexpr std::string enum_to_string(E value) {
std::string result = "<unnamed>";
[:expand(std::meta::enumerators_of(^E)):] >> // (2)
[&]<auto e>{
if (value == [:e:]) {
result = std::meta::identifier_of(e); // (3)
}
};
return result;
}
int main() {
std::cout << 'n';
enum Color { red, green, blue };
std::cout << "enum_to_string(Color::red): " << enum_to_string(Color::red) << 'n';
// std::cout << "enum_to_string(42): " << enum_to_string(42) << 'n';
std::cout << 'n';
}
(1) 'de veri türünün sahipliğini kullanarak kullanılır std::is_enum Kontrol edilip value Bir numaralandırıcı. İfade ^E (2) 'de yansımanın değerini yaratır. İşlev expand Aynı satırı görmezden gelebilirsiniz. Mevcut uygulamada genişleme talimatları eksiktir.
İşlevler std::meta::enumerators_of VE std::meta::enumerators_of (2) ve (3) 'de hedef işlevlerdir. Sadece derleme sırasında gerçekleştirilebilirler çünkü consteval İlan edilirler.
İşte bazı hedef işler.
namespace std::meta {
consteval auto members_of(info type_class) -> vector<info>;
consteval auto bases_of(info type_class) -> vector<info>;
consteval auto static_data_members_of(info type_class) -> vector<info>;
consteval auto nonstatic_data_members_of(info type_class) -> vector<info>;
consteval auto subobjects_of(info type_class) -> vector<info> {
auto subobjects = bases_of(type_class);
subobjects.append_range(nonstatic_data_members_of(type_class));
return subobjects;
}
consteval auto enumerators_of(info type_enum) -> vector<info>;
}
Tüm meta işlevler bir tane verir std::vector Geriye doğru. Yansıma, veri türlerini analiz etmek ve kod oluşturmak için birçok hedef eser sunar.
Enum h3>
Dizeden ters pasajların uygulanması bir enum yapar:
template <typename E>
requires std::is_enum_v<E>
constexpr std:
template for (constexpr auto e : std::meta::enumerators_of(^E)) {
if (name == std::meta::identifier_of(e)) {
return [:e:];
}
}
return std::nullopt;
}
Sırada ne var?
Yansıma birçok hedef işlevi sunar. Bir sonraki makalemde kullanacağım.
(RME)