用于不同类型标识符的编译时计数器

问题描述 投票:0回答:1

我正在编写一些模板元编程代码。由于某些原因,我想使代码中的每个对象都具有不同的类型。原始代码如下:

template<unsigned int index>
class Class1{

};

template<typename T1, typename T2, unsigned int index>
class Class2{
    std::tuple<T1*, T2*> v;
  public:
    Class2(T1* t1, T2* t2): v(std::tuple<T1*, T2*>(t1, t2)) {}
};

template<unsigned int index>
auto makeClass1() {
    return Class1<index>();
}

template<unsigned int index, typename T1, typename T2>
auto mul(T1& t1, T2& t2) {
    return Class2<T1, T2, index>(&t1, &t2);
}    

int main() {
    auto t1 = makeClass1<0>();  // Type of TT1 is Class1<0>
    auto t2 = makeClass1<1>();  // Type of TT2 is Class1<1>
    auto m1 = mul<0>(t1, t2);
    auto m2 = mul<1>(t1, t2); // Type of m2 is different from type of m1.
}

此代码有效,但我希望我的代码易于使用。所以我想问是否有任何解决方案可以使代码看起来像这样:

template<unsigned int index>
class Class1{

};

template<typename T1, typename T2, unsigned int index>
class Class2{
    std::tuple<T1*, T2*> v;
  public:
    Class2(T1* t1, T2* t2): v(std::tuple<T1*, T2*>(t1, t2)) {}
};

template<unsigned int index = IncreaseCounter<?>::value>
auto makeClass1() {
    return Class1<index>();
}

template<unsigned int index = IncreaseCounter<?>::value, typename T1, typename T2>
auto operator*(T1& t1, T2& t2) {
    return Class2<T1, T2, index>(&t1, &t2);
}

int main() {
    auto t1 = makeClass1();  // Type of TT1 is Class1<0>
    auto t2 = makeClass1();  // Type of TT2 is Class1<1>
    auto m1 = t1*t2
    auto m2 = t1*t2; // Type of m2 is different from type of m1.
}

注意:我认为我需要一个编译时计数器。但是除了宏解决方案:__COUNTER____LINE__之外,我找不到其他任何编译时解决方案。宏解决方案对我的代码无效。

除编译时计数器外,任何其他解决方案都可以。

感谢您阅读我的问题。由于我的英语表达能力很差,请忍受我错了句子。

c++ templates template-meta-programming
1个回答
0
投票

让我们考虑您问题的核心:

© www.soinside.com 2019 - 2024. All rights reserved.