Created
December 21, 2012 11:50
-
-
Save hisui/4352352 to your computer and use it in GitHub Desktop.
関数オブジェクトのシグニチャーでオーバーロード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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