我想拥有一个特定大小的std::tuple
,并且还提供一个函数,它接受与元组和相同精确类型一样多的参数。
我以为我可以使用可变参数模板函数从参数包中构造一个元组,并将这两个元组与std::is_same
进行比较
以下是一些示例代码,用于进一步解释我尝试过的内容
#include <tuple>
#include <iostream>
#include <string>
#include <typeinfo>
static const auto TupleInts =
std::make_tuple(
1,
2,
3
);
static const auto TuplePairs =
std::make_tuple(
std::make_pair(1, 1),
std::make_pair(2, 2),
std::make_pair(3, 3)
);
typedef decltype(TupleInts) TupleIntsType;
typedef decltype(TuplePairs) TuplePairsType;
typedef std::tuple<int, int, int> TupleType;
template<typename... Ts>
bool compare(Ts... vals) {
std::cout << typeid(std::tuple<Ts...>).name() << std::endl;
std::cout << typeid(TupleType).name() << std::endl;
return std::is_same < std::tuple<Ts...>, TupleType >::value;
}
template<typename... Ts>
bool comparePairsTuple(Ts... vals) {
std::cout << typeid(std::tuple<std::pair<int, Ts>...>).name() << std::endl;
std::cout << typeid(TuplePairsType).name() << std::endl;
return std::is_same < std::tuple<std::pair<int, Ts>...>, TuplePairsType >::value;
}
template<typename... Ts>
bool compareIntsTuple(Ts... vals) {
std::cout << typeid(std::tuple<Ts...>).name() << std::endl;
std::cout << typeid(TupleIntsType).name() << std::endl;
return std::is_same < std::tuple<Ts...>, TupleIntsType >::value;
}
int main() {
std::cout << comparePairsTuple(1, 2, 3) << std::endl;
std::cout << compareIntsTuple(1, 2, 3) << std::endl;
std::cout << compare(1, 2, 3) << std::endl;
return 0;
}
这是我在Visual Studio 2013(vc120)
下获得的class std::tuple<struct std::pair<int,int>,struct std::pair<int,int>,struct std::pair<int,int> >
class std::tuple<struct std::pair<int,int>,struct std::pair<int,int>,struct std::pair<int,int> >
0
class std::tuple<int,int,int>
class std::tuple<int,int,int>
0
class std::tuple<int,int,int>
class std::tuple<int,int,int>
1
和GCC 5.2.0
St5tupleIJSt4pairIiiES1_S1_EE
St5tupleIJSt4pairIiiES1_S1_EE
0
St5tupleIJiiiEE
St5tupleIJiiiEE
0
St5tupleIJiiiEE
St5tupleIJiiiEE
1
为什么前两个是__same false
而最后一个是true
;
答案 0 :(得分:2)
在前两种情况下,使用 std :: is_same 进行比较的类型具有不同的const限定条件。仅当给定类型相同且具有相同的const-volatile资格时, std :: is_same 才会为true。见http://en.cppreference.com/w/cpp/types/is_same
例如:
static const auto TupleInts =
std::make_tuple(
1,
2,
3
);
typedef decltype(TupleInts) TupleIntsType;
template<typename... Ts>
bool compareIntsTuple(Ts... vals) {
std::cout << typeid(std::tuple<Ts...>).name() << std::endl;
std::cout << typeid(TupleIntsType).name() << std::endl;
return std::is_same < std::tuple<Ts...>, TupleIntsType >::value;
}
TupleInts 声明为 const ,在函数 compareIntsTuple 中将其与 std :: tuple 进行比较'常量。
答案 1 :(得分:0)
typeid
会丢弃顶级cv限定符,而std::is_same
则不会。
要使其有效,请将const
添加到is_same
的一个或两个参数中:
return std::is_same <const std::tuple<std::pair<int, Ts>...>,
const TuplePairsType >::value;