21 Eylül 2020 Pazartesi

decltype Method Signature İçin Kullanımı

Metodun İmzasını Kontrol İçin
Şöyle yaparız. Aynı örneği static_assert yazısında da kullandım.
static_assert(std::is_same<decltype(c(0.0,0.0)), int>::value, 
"c must take two doubles and return int")
Metodun Varlığını Kontrol Etmek İçin
Örnek
Şöyle yaparızz
#include <iostream>
#include <vector>

template <typename T, typename = void>
struct has_begin : std::false_type {};

template <typename T>
struct has_begin<T,decltype(void(std::declval<T &>().begin()))> : std::true_type {};

int main(int argc, char *argv[])
{
    std::cout << has_begin<std::vector<int>>::value << std::endl;
}
Return Type Bulmak İçin
Bir metodun döndürdüğü tip şöyle bulunur.
typedef decltype(MyMethod(declval<MyType1>(),declval<MyType2>())) RetType;
Return Type Tanımlamak İçin
Template kodlarken return type bazen parametrelerde bağlı olabiliyor. Bu durumda decltype kullanılır.

Örnekte decltype a ve b'nin çarpımının tipi olarak kullanılmış
template<class A, class B>
void MultiplyAB(A a, B b, decltype(a*b)& output)
{
    output = a * b;
}
Eğer out parametresi yerine auto return type kullanırsak şöyle olur.
template<class A, class B>
auto MultiplyAB(A a, B b) -> decltype(a*b)
{
    return a * b;
}
Bazı örneklerde decltype sanki iki parametre alıyormuş gibi görünüyor. decltype iki parametre almaz. Sadece en son parametre return type tanımlamak için kullanılır. Diğer parametreler genelde bir koşulun doğruluğunu kontrol etmek için kullanılır.

Template kullansaydık, myClass sınıfının f metodu varsa (koşul) , void dön demek için şöyle yapardık.
template <typename T>
auto test(T &myclass) -> decltype(myclass.f(), void()) 
{
    // do something here, don't return anything (void)
}
Bir başka örnekte C sınıfının parametre almayan f metodu olup olmadığı kontrol ediliyor. f'nin döndürdüğü değer önemsiz.
template<class C, class F>
auto test(C c, F f) -> decltype((void)(c.*f)(), void()) { }



Hiç yorum yok:

Yorum Gönder