Skip to content

Instantly share code, notes, and snippets.

@hisui
Created December 21, 2012 11:50
Show Gist options
  • Save hisui/4352352 to your computer and use it in GitHub Desktop.
Save hisui/4352352 to your computer and use it in GitHub Desktop.
関数オブジェクトのシグニチャーでオーバーロード
#include <type_traits>
#include <functional>
#include <utility>
#include <iostream>
namespace
{
struct wildcard { wildcard(...); };
template<typename ...Args> inline auto invoke(wildcard, Args &&...args) -> wildcard;
template<typename ...Args, typename Func>
inline auto invoke(Func &&func, Args &&...args) -> decltype
(std::forward<Func>(func)(std::forward<Args>(args)...));
}
template<typename X, typename Y>
struct is_callable {};
template<typename Func, typename Ret, typename ...Args>
struct is_callable<Func,Ret(Args...)>
{
static constexpr bool value = std::is_same<Ret, decltype(invoke
( std::declval<Func>()
, std::declval<Args>()...))>::value;
};
extern void *enabler;
struct ser_tag {};
struct par_tag {};
struct Task
{
template<typename Func, typename std::enable_if<
is_callable<Func,void(int,par_tag)>::value>::type *& = enabler>
Task(Func &&func)
{
std::cerr << "Task: par" << std::endl;
func(3, par_tag());
}
template<typename Func, typename std::enable_if<
is_callable<Func,void(int,ser_tag)>::value>::type *& = enabler>
Task(Func &&func)
{
std::cerr << "Task: ser" << std::endl;
func(5, ser_tag());
}
};
int main()
{
Task task1([] (int n, ser_tag) { std::cerr << "ser func:" << n << std::endl; });
Task task2([] (int n, par_tag) { std::cerr << "par func:" << n << std::endl; });
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment