gpt4 book ai didi

c++ - 如何访问可变模板参数包成员中存在的内部模板 typedef?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:43 24 4
gpt4 key购买 nike

我有一些代码对我来说似乎没有歧义,但 gcc4.7 令人窒息:

#include <iostream>
#include <tuple>

using namespace std;

// Container for mixins
template<template<typename> class... Mixins>
struct Mix : Mixins<Mix<Mixins...>>... {
typedef tuple<Mixins<Mix<Mixins...>>...> types;
};

// Outer layer extracts the type tuple from the argument
template<typename T>
struct InnerCombiner {
typedef typename InnerCombiner<typename T::types>::type type;
};

// Typedef type to be a new mix of the inner mixins of the MixedMixins
template<typename... MixedMixins>
struct InnerCombiner<tuple<MixedMixins...>> {
// This line is the problem. The compiler doesn't seem to be able to make sense
// of the reference to the inner mixin template template classes
typedef Mix<MixedMixins::InnerMixin...> type;
};

template<typename Mixed>
struct A {
template<typename MixedInner>
struct InnerMixin {
void foo() { cout << "foo() loves you!" << endl; };
};
};

template<typename Mixed>
struct B {
template<typename MixedInner>
struct InnerMixin {
void bar() { cout << "bar() loves you!" << endl; };
};
};

// I'm going to write out the type I expect ic to have. Oh god, it's so nasty:
// Mix<
// A<Mix<A,B>>::InnerMixin<Mix<A<Mix<A,B>>::InnerMixin,B<Mix<A,B>>::InnerMixin>,
// B<Mix<A,B>>::InnerMixin<Mix<A<Mix<A,B>>::InnerMixin,B<Mix<A,B>>::InnerMixin>
// >


int main() {
InnerCombiner<Mix<A,B>>::type ic;

ic.bar(); // Not working.
}

这样访问 InnerMixins 有问题吗?写的时候觉得挺有道理的:)

最佳答案

我可以通过指定 InnerMixin 模板使其在 clang 3.0 上运行:

typedef Mix<MixedMixins::template InnerMixin...> type;
// ^^^^^^^^

但它在 g++ 4.8 上仍然失败,

3.cpp:23:52: error: parameter packs not expanded with ‘...’:3.cpp:23:52: note:         ‘MixedMixins’

关于c++ - 如何访问可变模板参数包成员中存在的内部模板 typedef?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782803/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com