2014-12-21 4 views
-1

Я хотел использовать 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; 

это для функций. но я не уверен, как использовать его для объектов функции. Я попытался привязать теги к двум аргументам функтора. не повезло!

+0

Как здесь используется 'funct_type'? – 0x499602D2

+0

вот что я хочу знать. как я его использую ..: -/ – Pogo

+0

Можете ли вы показать, как вы сделали это с регулярными функциями? Кроме того, почему вы хотите избежать перегрузки? Это прекрасная возможность для отправки тегов. – 0x499602D2

ответ

3

Я не уверен, что понимаю сложность вашей проблемы, так что либо я пропустил эту точку, либо вы чрезмерно скомпрометируете свой случай ... Почему бы не создать разные функторы и просто выбрать, какой из них использовать с условным?

struct functor1 { … }; 
struct functor2 { … }; 

using functor = std::conditional<condition, functor1, functor2>::type; 

std::for_each(v.begin(), v.end(), functor()); 
+0

вы, вероятно, Я не должен был усложнять методы отправки функций с объектами функций, это была простая идея, и я просто не мог думать в этом направлении, теперь это сработает для меня. – Pogo

Смежные вопросы