gpt4 book ai didi

c++ - 在 C++ 中,我可以使用定义中未使用的模板参数声明模板结构吗?

转载 作者:行者123 更新时间:2023-11-30 03:41:19 24 4
gpt4 key购买 nike

最近我正在阅读来自spirit-v2-json 的源代码, 我一直对 following code 感到困惑:

template <typename Tag> struct Literal 
{
bool operator==(Literal const&) const { return true; }
bool operator< (Literal const&) const { return false; }
};

typedef Literal<struct tag_undefined> Undefined;
typedef Literal<struct tag_null> Null;

问题一:Literal模板中的tag参数是什么意思?它是未使用的。问题2:struct tag_undefinedstruct tag_null连声明都没有定义,为什么可以作为模板参数使用呢?

最佳答案

tag 的目的参数是为了区分不同的类型。不要求它们显示任何功能差异,但它们需要是不同的类。因为这种区分是 tag 的唯一目的。参数并且因为它没有以任何方式在模板类本身中使用,所以可以直接在 typedef 中使用不完整的原位类型。 .

你为什么要这样做?在上面的用例中,代码使用此模板定义两个不同的类型,UndefinedNull .他们可以直接使用 struct Null 轻松创建这些类型和 struct Undefined , 但随后他们将不得不定义运算符 operator=operator<分开,这可能被认为是一种浪费。以这种方式使用类型标签可以实现与模板代码重用相同的效果。

如果您稍后查看代码,这两种类型实际上作为参数传递给了 boost::variant。 ,这是一种“多类型、单值”方法,用于表示变量类型中的值。这里的代码想要有 Undefined 的概念和 Null作为这个多类型系统中的不同类型(我想代表未定义或空的 json 对象)。

更新:根据 OP 的要求,这里有一些代码来演示在哪些地方可以使用和不可以使用不完整的类型:

struct incomplete_struct;
struct complete_struct{};

template<typename tag>
struct some_templ
{};

template<typename tag>
struct some_other_templ
{
tag member;
};

int main()
{
some_templ<incomplete_struct> a; //OK - incomplete template param type but not used in class so not instantiated
some_templ<struct inline_incomplete> b; //OK - as above

some_other_templ<complete_struct> c; //OK - complete_struct is complete type
some_other_templ<incomplete_struct> d; //Compile error - incomplete type, and used in template - thus instantiation of incomplete_struct is required but impossible

return 0;
}

关于c++ - 在 C++ 中,我可以使用定义中未使用的模板参数声明模板结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37430154/

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