2016-11-18 2 views
1

У меня есть boost :: tuple из указателей (количество указателей неизвестно заранее, что является шаблоном метапрограммирования).Nullify/Clear boost :: кортеж указателей

Например:

boost::tuple<int*, Foo*, std::string*> mytuple

Есть ли способ, чтобы инициализировать указатели на 0?

Я попытался создать предикат, такие как:

struct Nullify 
{ 
    template <class TypePtr> 
    void operator()(TypePtr& ptr) const 
    { 
     ptr = 0 
    } 
}; 

boost::fusion::for_each(mytuple, Nullify()); 

Но я получаю error: no matching function for call to...

В идеале, если это возможно, я хотел бы, чтобы использовать повышение :: лямбда внутри цикла for_each непосредственно не отдельная структура. (Я использую C++ 03)

например. для аннулирования

boost::fusion::for_each(mytuple, boost::lambda::_1 = 0); 

например. удалить

boost::fusion::for_each(mytuple, delete boost::lambda::_1); 
+2

Вы можете использовать некоторые [шаблоны] (https://stackoverflow.com/questions/10766112/c11-i-can-go-from-multiple-args-to-tuple-but-can-i-go- from-tuple-to-multiple), чтобы «распаковать» кортеж и выполнить операцию для каждого элемента. [См. Также] (https://stackoverflow.com/questions/7858817/unpacking-a-tuple-to-call-a-matching-function-pointer). – CoryKramer

+0

@CoryKramer C++ 03 – Yakk

+0

Я действительно хотел, чтобы это было сделано в режиме «диапазона»: в идеале я искал выражение boost: lambda (например, _1 = 0), чтобы включить в цикл for_each, чтобы оно было как насколько это возможно – codeJack

ответ

2

Это может быть сделано просто путем инициализации соответственно:

boost::tuple<int*, Foo*, std::string*> mytuple(nullptr, nullptr, nullptr); 

(или использовать NULL если nullptr не доступен в версии C++).

См. here, подраздел «Построение кортежей».

+0

Может работать для инициализации NULL, но мне понадобится решение для удаления каждого указателя. Плюс, я не знаю количество аргументов кортежа upfront (это часть некоторого шаблона метапрограммирования) – codeJack

+0

@codeJack: вы должны указать это в своем вопросе. – davidhigh

+0

Обновленный вопрос, sry и спасибо в любом случае за ответ – codeJack

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