現在、私は異なるタイプの異なるコードに対応しようとしています。これは正確なコードではありませんが、メッセージを受け取ります。部分的なバリデーションを伴うタプルの内容の特殊化
template<class A, class B>
struct alpha {
enum { value = 0 };
};
template<class T, class... Args>
struct alpha<std::tuple<Args...>, T> {
enum { value = 1 };
};
// This gets ignored
template<class T, class... Args>
struct alpha<std::tuple<Args..., std::vector<T> >, T> {
enum { value = 2 };
};
// This gets ignored
template<class T, class... Args>
struct alpha<std::tuple<Args..., T>, T> {
enum { value = 3 };
};
template<class T, class... Args>
struct alpha<T, std::tuple<Args...> > {
enum { value = 4 };
};
template<class... LArgs, class... RArgs>
struct alpha<std::tuple<LArgs...>, std::tuple<RArgs...> > {
enum { value = 5 };
};
int main(int argc, char* argv[]) {
std::cout << alpha<std::tuple<int, double>, double>::value << std::endl; // prints 1
return 0;
}
私はこのコードが示すよりも多くを試してみたが、何も今のところ機能していないと私は非名前空間スコープに明示的な特殊で問題に出くわしました。参考までに、私はgcc 4.6(1つのサーバに付属しているもの)に取り組んでいます。これは、完全な可変的なテンプレートサポートを持っていると思います。私は実装がパラメータパックの最後の引数と他の型を検出するように働くならば、それがどれほど醜いか気にしない。助言がありますか?
編集: 回答に基づいて私が使用したソリューションを共有したいと思いました(これは例です)。
template<typename T> struct tuple_last;
template<typename T, typename U, typename... Args>
struct tuple_last<std::tuple<T,U,Args...>> {
typedef typename tuple_last<std::tuple<U,Args...>>::type type;
};
template<typename T>
struct tuple_last<std::tuple<T>> {
typedef T type;
};
namespace details {
// default case:
template<class T, class U>
struct alpha_impl {
enum { value = 1 };
};
template<class T>
struct alpha_impl<T, T> {
enum { value = 101 };
};
template<class T>
struct alpha_impl<T, std::vector<T>> {
enum { value = 102 };
};
// and so on.
}
template<class T, class... Args>
struct alpha<std::tuple<Args...>, T>
: details::alpha_impl<T, tuple_last<std::tuple<Args...>>;
私は "解決策"が何であるか、まったく何があるか分かりません。しかし、ここに知っている人がいます。 –
少なくとも、この方法を使用する可能性のある解決法はありませんし、私は他の人に移ります。私が好きなものを思いついたら、それを投稿します。 – norcalli
これが問題だとすれば、左側のパックを展開してみませんか? – dascandy