我想要一个在其构造函数中包含两个参数的类.第一个可以是int,double或float,所以<typename T>,第二个总是字符串文字"my string",所以我想const char * const.
任何人都可以给我一些可编译的代码,声明一个简单的类模板,并声明该类的对象?
谢谢
if constexpr()和之间有什么区别if()?
我何时何地可以同时使用它们?
我想编写一个函数模板,对一个字符串容器进行操作,例如a std::vector.
我想支持两者CString并std::wstring使用相同的模板功能.
问题是,CStringwstring有不同的接口,例如获取a的"长度" CString,你调用GetLength()方法,而不是你调用的wstring size()或length().
如果我们在C++中有一个"静态if"功能,我可以这样写:
template <typename ContainerOfStrings>
void DoSomething(const ContainerOfStrings& strings)
{
for (const auto & s : strings)
{
static_if(strings::value_type is CString)
{
// Use the CString interface
}
static_else_if(strings::value_type is wstring)
{
// Use the wstring interface
}
}
}
Run Code Online (Sandbox Code Playgroud)
是否有一些模板编程技术可以使用当前可用的C++ 11/14工具实现这一目标?
PS
我知道可以DoSomething()用vector<CString>和编写几个重载vector<wstring>,但这不是问题的关键.
此外,我希望这个函数模板适用于任何可以使用range-for循环进行迭代的容器.
以下C++无效,因为引用变量需要初始值设定项:
int& a; // illegal
if (isfive) {
a = 5;
} else {
a = 4;
}
Run Code Online (Sandbox Code Playgroud)
但是,MSVC似乎认为这没关系:
int& a = isfive ? 5 : 4;
Run Code Online (Sandbox Code Playgroud)
这意味着MSVC实际上将条件运算符视为单个表达式,而不是将其扩展为if-else语句.
使用条件运算符初始化引用始终是有效的C++吗?
我知道C++中的一些元编程技术可以在编译时计算常量.元函数中的大多数时间分支是通过三元运算符完成的,可以在编译时以与标准if/else相反的方式进行评估.
但是关于这种功能:
template <unsigned int N>
void f()
{
if (N == 0) {
// Some computations here
} else if (N <= 42) {
// Some computations here
} else {
// Some computations here
}
}
Run Code Online (Sandbox Code Playgroud)
编译器会做什么(假设-O3)?编译器知道f<0>()将始终在第一种情况下f<32>()分支,将始终在第二种情况下f<64>()分支,并且将始终在第三种情况下分支.
编译器会删除永远存在的分支false吗?它会直接分支到唯一有效的案例吗?
c++ ×5
templates ×3
c++11 ×2
if-statement ×2
c++17 ×1
compile-time ×1
constexpr ×1
containers ×1
optimization ×1
reference ×1