1

このコードを使用して、可変個引数テンプレートを使用して複数の関数ラッパーを作成しています。

// Compile with g++ -std=c++0x $(pkg-config sigc++-2.0 --cflags --libs) test.cpp -o test
#include <iostream>
#include <type_traits>
#include <sigc++/sigc++.h>

template <typename R, typename G, typename... Ts>
class FuncWrapper
{
public:
  FuncWrapper(G object, std::string const& name, sigc::slot<R, Ts...> function) {};
};

int main()
{
  FuncWrapper<void, int, int, bool, char> tst(0, "test", [] (int a, bool b, char c) {});

  return EXIT_SUCCESS;
}

このコードはclang++で正しくコンパイルされますが、既知の問題のためにg++ではコンパイルされません。

test.cpp:9:73:申し訳ありませんが、実装されていません:「Ts...」を固定長の引数リストに展開できません

gcc-4.7がこれを正しく処理する必要があることはわかっていますが、今のところアップグレードできません...したがって、Ts...正しく解凍するための回避策が必要です。私はこのような質問でここで提案されたものをテストしましたが、彼らはここで問題を解決していないようです。

4

1 に答える 1

5

次の方法でバグを回避できます。

template<template <typename...> class T, typename... Args>
struct Join
{ typedef T<Args...> type; };

その後、に置き換えsigc::slot<R, Ts...>ますtypename Join<sigc::slot, R, Ts...>::type

( GCCバグレポートに関するChris Jeffersonの提案に感謝します)

于 2012-07-02T16:41:07.023 に答える