gpt4 book ai didi

c++ - 混合 typedef 和 CRTP?

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

考虑以下示例:

#include <iostream>
#include <iostream>
#include <type_traits>

template<typename Type, template<typename> class Crtp>
class Base
{
public:
typedef int value;

// f1: OK
// Expected result: casts 4.2 to Base<Type, Crtp>::value
value f1() {return 4.2;}

// f2: NOT OK
// Expected result: casts 4.2 to Crtp<Type>::value
// But f2 does not compile: no type named 'value'
// in 'class Derived<double>'
typename Crtp<Type>::value f2() {return 4.2;}
};

template<typename Type>
class Derived : public Base<Type, Derived>
{
public:
typedef Type value;
};

int main()
{
Derived<double> a;
std::cout<<a.f1()<<std::endl;
std::cout<<a.f2()<<std::endl;
return 0;
}

如何解决这个问题(Derived typedef unknown from the Base class)?

编辑:我发现了一个非常简单的技巧。有人可以向我解释为什么以下版本有效而​​以前的版本无效吗?这个技巧是否适用于标准 C++11,还是因为编译器的工作方式(此处为 g++ 4.7.1)而起作用?

#include <iostream>
#include <iostream>
#include <type_traits>

template<typename Type, template<typename> class Crtp>
class Base
{
public:
typedef int value;
value f1() {return 4.2;}
template<typename T = Crtp<Type>> typename T::value f2() {return 4.2;}
};

template<typename Type>
class Derived : public Base<Type, Derived>
{
public:
typedef Type value;
};

int main()
{
Derived<double> a;
std::cout<<a.f1()<<std::endl;
std::cout<<a.f2()<<std::endl;
return 0;
}

最佳答案

您必须使用在定义Base 之前声明的包装类(这里是value_getter)。然后,您可以在定义 Derived 之前对其进行特殊化:

template<typename T>
struct value_getter;

template<typename Type, template<typename> class Crtp>
class Base
{
public:
typedef int value;

value f1() {return 4.2;}

// in 'class Derived<double>'
typename value_getter<Crtp<Type> >::value f2() {return 4.2;}
};

template<typename Type>
class Derived;

template<typename Type>
struct value_getter<Derived<Type> > {
typedef Type value;
};

template<typename Type>
class Derived : public Base<Type, Derived>, public value_getter<Derived<Type> >
{
public:
};

它不是很漂亮,但至少它是有效的。

关于c++ - 混合 typedef 和 CRTP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14022493/

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