相关疑难解决方法(0)

std :: common_type的目的是什么?

我开始关注std::common_type并且不确定它的用途和功能.有些事情让我觉得奇怪:

  • 争论的顺序很重要:common_type<Foo, Bar, Baz>可能与之不同common_type<Baz, Foo, Bar>.要么可以编译,要么可能没有.虽然从common_type定义的方式来看这很清楚,但它感觉奇怪且不直观.这是因为缺乏通用解决方案还是打算?
  • 实例化可能导致编译器错误,而不是我可以处理的事情.如何检查是否common_type实际编译?可能是专门的is_convertible还不够common_type
  • 在这样的情况下仍然无法找出常见类型:

    struct Baz;
    struct Bar { int m; };
    struct Foo { int m; }; 
    struct Baz { Baz(const Bar&); Baz(const Foo&); };
    
    Run Code Online (Sandbox Code Playgroud)

    建议的解决方案是专业化common_type,这是繁琐的.有更好的解决方案吗?

有关参考,请参见N3242中的§20.9.7.6表57.

c++ c++11

20
推荐指数
2
解决办法
3299
查看次数

std :: tuple和标准布局

如果所有成员std::tuple都是标准布局类型,那std::tuple本身就是标准布局吗?用户定义的复制构造函数的存在使它变得非常重要,但我想知道它是否仍然是标准布局.

从规范中引用会很好.

c++ language-lawyer c++11

13
推荐指数
2
解决办法
1852
查看次数

C++ 11索引模板参数包在运行时以访问第N类型

从这个SO主题(和这篇博文),我知道如何在模板参数包中访问第N类型.例如,上述SO问题的答案之一表明:

template<int N, typename... Ts> using NthTypeOf = typename std::tuple_element<N, std::tuple<Ts...>>::type;

using ThirdType = NthTypeOf<2, Ts...>;
Run Code Online (Sandbox Code Playgroud)

但是,这些方法仅在编译时起作用.尝试做以下事情:

int argumentNumber = 2;
using ItsType = NthTypeOf<argumentNumber, Arguments...>;
Run Code Online (Sandbox Code Playgroud)

会导致编译错误:

错误:非类型模板参数不是常量表达式

有没有办法在运行时访问第N类型?


这是我的用例:

我的程序读取一个文本文件,它基本上是一个数字数组.每个数字i指的是我的类基于模板化的模板参数包的第i种类型.基于该类型,我想声明该类型的变量并对其执行不同的操作.例如,如果它是一个字符串,我想声明一个字符串并进行字符串匹配,如果它是一个整数,我想计算一个数字的平方根.

c++ variadic-templates c++11

8
推荐指数
1
解决办法
1154
查看次数

从boost :: variant获取索引项,就像使用std :: variant一样

随着std::variant<int, bool>我可以调用std::get<0>(var)的变种来获取值,因为它是第一种类型- int.

我怎么能这样做boost::variantboost::get<>似乎只支持按类型而不是索引获取,我发现文档很难理解.

c++ boost variant boost-variant

5
推荐指数
1
解决办法
910
查看次数

如何访问integer_sequence的第n个值?

我想知道如何访问一个第n个值std::integer_sequence.例如给定一种类型

using foo = std::integer_sequence<int, 3, 1, 4>;
Run Code Online (Sandbox Code Playgroud)

我想有类似的东西

auto i = get<foo, 2>(); // i = 4
Run Code Online (Sandbox Code Playgroud)

标准库中有什么东西可以做到吗?如果不是,如果我想在C++ 14(而不是C++ 17)中使用它,我是否需要求助于迭代解决方案?

c++ c++14

4
推荐指数
1
解决办法
423
查看次数

如何在可变参数模板中冒泡最后一个元素?

我有模板函数可以将可变参数模板作为(例如)作为 (int, int, double)

template<class... Arg>
void
bubble(const Arg &...arg)
{ another_function(arg...); }
Run Code Online (Sandbox Code Playgroud)

在函数内部,我必须使用不同的参数顺序调用(double, int, int)。我该如何实施?

c++ c++14

2
推荐指数
1
解决办法
103
查看次数

是否可以调用具有不同数量的参数的函数,并传递相同的参数包

比如说我有两个简单的功能:

void a(int x)
{
    //do something with x
}

void b(int x, float y)
{
    // do something with x and y
}
Run Code Online (Sandbox Code Playgroud)

我希望有一个具有可变数量的args的单个函数,它可以根据标志调用上述两个:

template<typename... Args>
void varArgs(bool a_or_b, Args... args)
{
    if (a_or_b)
        a(args...);
    else
        b(args...);
}
Run Code Online (Sandbox Code Playgroud)

该标志将告诉我们是否要使用第一个或第二个函数,但是因为模板在编​​译时被实例化,所以这将不起作用.我读过constexpr if但是我只能使用c ++ 14所以我想知道是否有其他选择?

编辑:bool可以是编译时常量,而不是运行时参数.

c++ templates parameter-passing variadic-templates c++14

1
推荐指数
1
解决办法
72
查看次数