2013-04-23 4 views
-5

Есть ли способ определить переменный шаблон макроса, как переменный макрос?Есть ли способ определить шаблон шаблона Variadic?

Например, если определить VARIADIC макрос как:

#define PRINT_STRING(fmtId, ...) { \ 
    CString fmt; \ 
    fmt.FormatString(fmt, ##__VA_ARGS__); \ 
    cout << fmt << endl; } 

Можем ли мы определить что-то вроде:

#define PARSE_FUNCTION(functionName, typename...) \ 
    std::function<int(typename...)> m_##functionName(){ \ 
     return (std::function<int(typename...)>) functionName; } 
+0

Что? вы можете объяснить, что вы хотите более подробно, я не получил его ... – Thibaut

+5

Макросы и шаблоны - это не одно и то же. Это похоже на проблему XY. Объясните, что вы пытаетесь достичь *, а не как пытаетесь это сделать. –

+0

Спасибо, да, я думаю, это тоже глупый вопрос :) –

ответ

1

__VA_ARGS__ может быть использована несколько раз, так что вы могли бы написать:

#define PARSE_FUNCTION(functionName, ...) \ 
    std::function<int(__VA_ARGS__)> m_##functionName() { \ 
     return std::function<int(__VA_ARGS__)>(functionName); \ 
    } 

Что происходит, это просто простая замена текста, независимо от того, являются ли аргументы i s для шаблона или не будет проверяться препроцессором.

Фактически любые объекты функции могут быть неявно преобразованы в std::function, поэтому литье может быть опущено. Кроме того, если functionName относится к указателями на функции, точный тип можно легко сделать вывод, что вам не нужно VARIADIC макрос на все:

#define PARSE_FUNCTION(functionName) \ 
    auto m_##functionName() \ 
     -> std::function<std::remove_pointer<decltype(functionName)>::type> \ 
    { \ 
     return functionName; \ 
    } 
Смежные вопросы