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
#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 İçinBir 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()) { }