私はこのようなクラスを持っていました:
class Test {
public:
bool bar(int &i, char c) // some arguments are passed by ref, some are by value
{/*...*/}
bool foo(/*...*/)
{}
};
また、bar1 / bar2などを繰り返し呼び出してから、戻り値を何度も確認したくないので、これらを処理するためのマクロと可変個引数のテンプレートを作成しました。
#define help_macro(object, memfn, ...) help_func(#object "." #memfn, \
object, &decltype(object)::memfn, ##__VA_ARGS__)
template<class T, typename Func, typename... Args>
void help_func(char const * name, T &&object, Func memfn, Args&&... args)
{
auto ret = (object.*memfn)(forward<Args>(args)...);
cout<<name<<":\t"
<<(ret ? "OK" : "Oops") // maybe I'll throw an exception here
<<endl;
}
そして、このように使用します
int i = 0;
Test t;
help_macro(t, bar, i, 'a');
g ++-4.7 / Debianで動作しますが、ICC13.0 / Winはコンパイルを拒否します(非常に奇妙なエラーメッセージ)
main.cpp(37):エラー:タイプ名は許可されていません
help_macro(t、bar、i、'a');
^
main.cpp(37):エラー:「)」
help_macro(t、bar、i、'a');が必要です。
^
ICCのC++11をオンにして、ICC13が可変個引数テンプレートとdecltypeをサポートしていることを確認しました。間違って使用していますか、それともICCの問題ですか。