#include <utility>

template <class... X> class Hoge
{
public:

void invoke(X... x)
{
func(x...);
}

template <class... Y> void t_invoke(Y &&... y)
{
func(std::forward<Y>(y)...);
}

private:

void func(X... x)
{
}
};

t_invokeのほうは無駄なく転送してくれそうなのですがinvokeのほうだとコピーコストが発生して困ります
かといって引数の型をX &&...やconst X &..に変更すると引数によってコンパイルエラーが出ます
そして引数の参照性やconst性の組み合わせを網羅してオーバーロードするのも可変長では無理ですしできても現実的じゃありません
何とかしてinvokeのほうでも無駄なコピーのない転送を実現したいんですがどうすればいいんでしょうか?
最終的にinvokeを関数ポインタにしたいのでどうしてもtemplateは使えないんです