Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » C++0x: is_callable

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.01.2011, 19:53 Uhr
TOSHMAX



Ich versuche gerade herauszufinden ob ein bestimmtes Objekt / Funktion mit bestimmten Parametern aufgerufen werden kann. Jetzt bekomme ich allerdings beim unten stehenden Code einen Fehler und ich komme einfach auf keine Lösung.

Der Fehler wird hervorgerufen von "function1":

Code:
invalid conversion from 'int' to 'const char*'



C++:
#include <iostream>

#include <string>
#include <type_traits>

using std::declval;

template<typename, typename T, typename... Args>
struct is_callable_helper
    : public std::false_type {};

template<typename T, typename... Args>
struct is_callable_helper<decltype(declval<T>()(declval<Args>()...), std::true_type()), T, Args...>
    : public std::true_type {};

template<typename T, typename... Args>
struct is_callable
    : public is_callable_helper<std::true_type, T, Args...> {}; // Fehler hier

bool function1(std::string, std::string&) { return false; }
bool function2(std::string&, std::string&) { return false; }

struct structure {
    bool operator()(std::string, std::string&) const { return false; }
};

int main()
{
    std::cout << is_callable<structure, int&, int&>::value << std::endl;
    std::cout << is_callable<decltype(function1), int&, int&>::value << std::endl;
    std::cout << is_callable<decltype(function2), int&, int&>::value << std::endl;
    return 0;
}


Vielleicht weiß einer wie man das umgehen kann, bzw. warum der Fehler bei "structure" nicht kommt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.01.2011, 11:55 Uhr
TOSHMAX



So habs jetzt doch noch selbst geschafft:

C++:
template<typename>
struct callable_struct;

template<typename Res, typename... Args>
struct callable_struct<Res(Args...)> {
    Res operator()(Args...);
};

template<typename Res, typename... Args>
struct callable_struct<Res(Args......)> {
    Res operator()(Args......);
};

template<typename, typename, typename T, typename... Args>
struct is_callable_helper
    : public std::false_type {};

template<typename T, typename... Args>
struct is_callable_helper<std::true_type, decltype(declval<callable_struct<T>>()(declval<Args>()...), std::true_type()), T, Args...>
    : public std::true_type {};

template<typename T, typename... Args>
struct is_callable_helper<std::false_type, decltype(declval<T>()(declval<Args>()...), std::true_type()), T, Args...>
    : public std::true_type {};

template<typename T, typename... Args>
struct is_callable
    : public is_callable_helper<typename std::is_function<T>::type, std::true_type, T, Args...> {};
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: