Я хотел использовать SFINAE для работы с объектами. Например:Как использовать SFINAE для объектов функции с различными методами operator()
struct functor_1_tag{ };
struct functor_2_tag{ };
struct functor_3_tag{ };
template<typename Graph_t>
struct functor {
functor() { };
functor(Graph_t& G) : m_G(G) { }
template<typename vertex_t>
void operator(vertex_t vertex) {
/// do stuff with vertex
}
private:
Graph_t& m_G;
};
// Similary another 2 functors that have operator() doing different tasks.
//Usecase:
// just for 2 functors here
typedef std::conditional <true, functor_1_tag, functor_2_tag>::type funct_type;
/// functor --> shud be selected based upon conditional above.??
auto func = std::bind(functor<graph>, G, std::placeholders::_1);
// use in algorithm for vertices
std::for_each(vertexset.begin(), vertexset.end(), func);
do stuff with vertex
(по существу operator()
) отличается на основании тегов функторных и я хочу перегружать эти трех функторов, основанных на тегах или любые другие методы, такие как std::conditional, or std::enable_if or any nested condition checker.
я был в состоянии добиться того же самого для моих стандартных функций. но я не уверен, как это сделать для функторов. Дело в том, что функторы отличаются только своей реализацией operator(), и я не хочу перегружать методы operator().
Tag диспетчерская для функций:
struct func1_tag{ };
struct func2_tag{ };
void do_this(int x)
{
do_this_actually(int x, dispatch());
}
do_this_actually(int x, func1_tag) { //do stuff }
do_this_actually(int x, func2_tag) { // ... }
typedef std::conditional<true, func1_tag, func2_tag>::type dispatch;
это для функций. но я не уверен, как использовать его для объектов функции. Я попытался привязать теги к двум аргументам функтора. не повезло!
Как здесь используется 'funct_type'? – 0x499602D2
вот что я хочу знать. как я его использую ..: -/ – Pogo
Можете ли вы показать, как вы сделали это с регулярными функциями? Кроме того, почему вы хотите избежать перегрузки? Это прекрасная возможность для отправки тегов. – 0x499602D2