Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 706951
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 14, 20262026-05-14T04:13:23+00:00 2026-05-14T04:13:23+00:00

I’ve written a traits class that lets me extract information about the arguments and

  • 0

I’ve written a traits class that lets me extract information about the arguments and type of a function or function object in C++0x (tested with gcc 4.5.0). The general case handles function objects:

template <typename F>
struct function_traits {
    template <typename R, typename... A>
    struct _internal { };

    template <typename R, typename... A>
    struct _internal<R (F::*)(A...)> {
        // ...
    };

    typedef typename _internal<decltype(&F::operator())>::<<nested types go here>>;
};

Then I have a specialization for plain functions at global scope:

template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
    // ...
};

This works fine, I can pass a function into the template or a function object and it works properly:

template <typename F>
void foo(F f) {
    typename function_traits<F>::whatever ...;
}

int f(int x) { ... }
foo(f);

What if, instead of passing a function or function object into foo, I want to pass a lambda expression?

foo([](int x) { ... });

The problem here is that neither specialization of function_traits<> applies. The C++0x draft says that the type of the expression is a “unique, unnamed, non-union class type”. Demangling the result of calling typeid(...).name() on the expression gives me what appears to be gcc’s internal naming convention for the lambda, main::{lambda(int)#1}, not something that syntactically represents a C++ typename.

In short, is there anything I can put into the template here:

template <typename R, typename... A>
struct function_traits<????> { ... }

that will allow this traits class to accept a lambda expression?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-14T04:13:24+00:00Added an answer on May 14, 2026 at 4:13 am

    I think it is possible to specialize traits for lambdas and do pattern matching on the signature of the unnamed functor. Here is the code that works on g++ 4.5. Although it works, the pattern matching on lambda appears to be working contrary to the intuition. I’ve comments inline.

    struct X
    {
      float operator () (float i) { return i*2; }
      // If the following is enabled, program fails to compile
      // mostly because of ambiguity reasons.
      //double operator () (float i, double d) { return d*f; } 
    };
    
    template <typename T>
    struct function_traits // matches when T=X or T=lambda
    // As expected, lambda creates a "unique, unnamed, non-union class type" 
    // so it matches here
    {
      // Here is what you are looking for. The type of the member operator()
      // of the lambda is taken and mapped again on function_traits.
      typedef typename function_traits<decltype(&T::operator())>::return_type return_type;
    };
    
    // matches for X::operator() but not of lambda::operator()
    template <typename R, typename C, typename... A>
    struct function_traits<R (C::*)(A...)> 
    {
      typedef R return_type;
    };
    
    // I initially thought the above defined member function specialization of 
    // the trait will match lambdas::operator() because a lambda is a functor.
    // It does not, however. Instead, it matches the one below.
    // I wonder why? implementation defined?
    template <typename R, typename... A>
    struct function_traits<R (*)(A...)> // matches for lambda::operator() 
    {
      typedef R return_type;
    };
    
    template <typename F>
    typename function_traits<F>::return_type
    foo(F f)
    {
      return f(10);
    }
    
    template <typename F>
    typename function_traits<F>::return_type
    bar(F f)
    {
      return f(5.0f, 100, 0.34);
    }
    
    int f(int x) { return x + x;  }
    
    int main(void)
    {
      foo(f);
      foo(X());
      bar([](float f, int l, double d){ return f+l+d; });
    }
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 357k
  • Answers 357k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer I've seen this behaviour (or similar behaviour at least) following… May 14, 2026 at 9:05 am
  • Editorial Team
    Editorial Team added an answer If you really must use an image then there's a… May 14, 2026 at 9:05 am
  • Editorial Team
    Editorial Team added an answer HTTPS? If your client is using something proprietary with a… May 14, 2026 at 9:05 am

Related Questions

I've got a string that has curly quotes in it. I'd like to replace
I'm trying to decode HTML entries from here NYTimes.com and I cannot figure out
I ran into a problem. Wrote the following code snippet: teksti = teksti.Trim() teksti
I have a French site that I want to parse, but am running into
I have text I am displaying in SIlverlight that is coming from a CMS

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.