CodeNebula
C++11stlintermediate

std::result_of (C++11 Addition)

C++11 · Modern Revolution · Compiler flag: -std=c++11

Explanation

Deduces the return type of invoking a callable with given argument types, enabling generic wrapper functions.

Real-World Scenario

Determine the return type of a callback in a generic task scheduler.

Quick Snippet

snippet.cpp
#include <type_traits>
int func(double);
using R = std::result_of<decltype(func)&(double)>::type; // int

Full Example

result_of.cpp
// CodeNebula - C++11 Example: result_of
// Compile: g++ -std=c++11 -Wall -Wextra -o example result_of.cpp

// Demonstrates std::result_of to deduce the return type of a callable.
// Note: std::result_of is deprecated in C++17; use std::invoke_result instead.

#include <iostream>
#include <type_traits>
#include <functional>

int add(int a, int b) { return a + b; }
double multiply(double a, double b) { return a * b; }

struct Functor {
    std::string operator()(int n) const {
        return std::to_string(n);
    }
};

// Use result_of to deduce return type in a wrapper
template<typename F, typename Arg>
typename std::result_of<F(Arg)>::type
apply(F f, Arg a) {
    return f(a);
}

int main() {
    std::cout << "=== std::result_of ===" << std::endl;

    // Deduce return types of various callables
    using AddResult = std::result_of<decltype(add)&(int, int)>::type;
    using MulResult = std::result_of<decltype(multiply)&(double, double)>::type;
    using FuncResult = std::result_of<Functor(int)>::type;

    std::cout << "add returns int:        "
              << std::is_same<AddResult, int>::value << std::endl;
    std::cout << "multiply returns double: "
              << std::is_same<MulResult, double>::value << std::endl;
    std::cout << "Functor returns string:  "
              << std::is_same<FuncResult, std::string>::value << std::endl;

    // Lambda result type
    auto lambda = [](int x) -> double { return x * 1.5; };
    using LambdaResult = std::result_of<decltype(lambda)(int)>::type;
    std::cout << "lambda returns double:   "
              << std::is_same<LambdaResult, double>::value << std::endl;

    // Practical wrapper usage
    Functor f;
    auto result = apply(f, 42);
    std::cout << "\napply(Functor, 42) = \"" << result << "\"" << std::endl;
    std::cout << "Result is string: "
              << std::is_same<decltype(result), std::string>::value << std::endl;

    std::cout << "\nAll checks passed!" << std::endl;
    return 0;
}

// Expected output:
// === std::result_of ===
// add returns int:        1
// multiply returns double: 1
// Functor returns string:  1
// lambda returns double:   1
//
// apply(Functor, 42) = "42"
// Result is string: 1
//
// All checks passed!
Run command
g++ -std=c++11 -Wall -Wextra -o example result_of.cpp