C++ 0x özelliklerinden bazılarını anlamak için kişisel deneylerimden biri: Çalıştırılacak bir şablon işlevine bir işlev işaretçisini iletmeye çalışıyorum. Sonuç olarak, yürütmenin farklı bir iş parçacığında gerçekleşmesi gerekiyor. Ancak, tüm farklı işlev türlerinde, şablonların çalışmasını sağlayamıyorum.Şablonlar, İşlev İşaretçiler ve C++ 0x
#include <functional>
int foo(void) {return 2;}
class bar {
public:
int operator() (void) {return 4;};
int something(int a) {return a;};
};
template <class C>
int func(C&& c)
{
//typedef typename std::result_of< C() >::type result_type;
typedef typename std::conditional<
std::is_pointer<C>::value,
std::result_of< C() >::type,
std::conditional<
std::is_object<C>::value,
std::result_of< typename C::operator() >::type,
void>
>::type result_type;
result_type result = c();
return result;
}
int main(int argc, char* argv[])
{
// call with a function pointer
func(foo);
// call with a member function
bar b;
func(b);
// call with a bind expression
func(std::bind(&bar::something, b, 42));
// call with a lambda expression
func([](void)->int {return 12;});
return 0;
}
result_of şablon yalnız sınıf bar ve ben derleme değil yarattı aksak koşullu operatöre() bulmak mümkün görünmemektedir. Herhangi bir fikir? Const fonksiyonları ile ek sorunlarım olacak mı?
Belki de derleme değil, çünkü 'func'' result_type' yerine 'int' döndürür (bu örnekte' int' tüm örneklerde 'ancak yine de bir soruna neden olabilir)? –
@Chris: Hayır, nedeni bu değil. – kennytm
@KennyTM - Ben düşündüm, ama yine de sorun olduğunu düşünüyorum. –