Şöyle yaparız. Aynı örneği static_assert yazısında da kullandım.Return Type Bulmak İçin
Bir metodun döndürdüğü tip şöyle bulunur.
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 kullansaydık, myClass sınıfının f metodu varsa (koşul) , void dön demek için şöyle yapardık.
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;
}
Bir metodun döndürdüğü tip şöyle bulunur.
typedef decltype(MyMethod(declval<MyType1>(),declval<MyType2>())) RetType;
Return Type Tanımlamak İçinTemplate 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