我有一个问题是重载<<流操作符,我找不到解决方案:
template<class T, unsigned int TN>
class NVector
{
inline friend std::ostream& operator<< (
std::ostream &lhs, const NVector<T, TN> &rhs);
};
template<class T, unsigned int TN>
inline std::ostream& NVector<T, TN>::operator<<(
std::ostream &lhs, const NVector<T, TN> &rhs)
{
/* SOMETHING */
return lhs;
};
Run Code Online (Sandbox Code Playgroud)
它会产生以下错误消息:
警告:朋友声明'std :: ostream&operator <<(std :: ostream&,const NVector&)'声明一个非模板函数[-Wnon-template-friend]
错误:'std :: ostream&NVector :: operator <<(std :: ostream&,const NVector&)'必须只有一个参数
如何解决这个问题?
非常感谢你.
我有几个带有"static const"数据成员的类.我想知道如何使用static_assert在编译时检查它们的值.我可以将static_assert直接放在类体中吗?(将static_assert放在每个构造函数中都不太实用.)
在.cpp文件中声明模板类的朋友函数(对于std :: ostream和operator <<)的正确方法是什么?
我当前的实现不起作用:
// MyTest.h
template<class T, unsigned int TSIZE> class MyTest
{
inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs);
};
// MyTest.cpp
template<class T, unsigned int TSIZE> inline friend std::ostream& operator<< <T, TSIZE> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs)
{
// IMPLEMENTATION
}
Run Code Online (Sandbox Code Playgroud)
非常感谢你 !
在C++ 11中,有没有办法将算术类和类类型的值初始化为零(算术类型的运行时绝对没有开销)?
template<typename T> void myFunction(T& x)
{
x = 0; // How to make this works for T = double but also for T = std::string ?
}
Run Code Online (Sandbox Code Playgroud) 以下编译在g ++中没有问题:
template<typename ReturnType = double, typename OtherType> ReturnType func(const OtherType& var)
{
ReturnType result = 0;
/* SOMETHING */
return result;
}
Run Code Online (Sandbox Code Playgroud)
在默认模板参数(OtherType此处)之后,所有符合标准的编译器是否可以使用非默认模板参数(ReturnType此处)?
是否C++ 11标准指定的numeric_limits<T>::min和max必须是能够在模板或使用常数表达式static_assert?
更一般地说,如何根据标准找到常量表达式的函数列表?
我目前有以下函数来读取数据或原始数据的向量(_readStream是a std::ifstream):
template<typename IteratorType>
inline bool MyClass::readRawData(
const IteratorType& first,
const IteratorType& last,
typename std::iterator_traits<IteratorType>::iterator_category* = nullptr
)
{
_readStream.read(reinterpret_cast<char*>(&*first), (last-first)*sizeof(*first));
return _readStream.good();
}
Run Code Online (Sandbox Code Playgroud)
第一个问题:这个功能对你来说好吗?
当我们直接读取内存块,如果从内存块只会工作first到last是在内存中连续的.怎么检查?
我在C++中有一个"好的设计实践"的问题.我正在用C++ 11编写一个数值库,我使用了大量的元编程和基于模板的技术.但我有一个非常基本的问题:
考虑一个可以有两个非常接近的行为的函数,除了可以通过布尔标志激活的选项.我只考虑开发人员可以设置/取消设置的标志,而不是可以在运行时设置/取消设置的标志.有3种设计可能性:
1)在名称中使用explicit选项编写两个函数:
myFunctionFlag1(...);
myFunctionFlag2(...);
Run Code Online (Sandbox Code Playgroud)
2)使用模板参数:
template<bool Flag> myFunction(...);
Run Code Online (Sandbox Code Playgroud)
3)使用变量参数:
myFunction(..., const bool flag);
Run Code Online (Sandbox Code Playgroud)
在良好的设计实践方面,哪种解决方案可接受/不可接受?如果有最佳解决方案,那是哪一个?为什么?如果有一个最糟糕的解决方案,那是哪一个?为什么?
编辑:对于所考虑的函数,运行时开销可以被认为是可以忽略不计的,因此这不是最关键的一点.
编辑2:我知道所有三个工作.但是由于我的图书馆将拥有用户,因此需要有可靠/优秀的设计.
选项2是否常见(因为在我看来这是一个很好的妥协)?
我目前正在编写一个函数来测试sizeof()C++中的字节序和基本类型,以便检测系统/编译器是"经典"还是非标准.我搜索这个函数的名称,checkSystemSOMETHING()但是我不知道与类型或字节序的二进制表示相关联的单词.什么是最好的替代词SOMETHING?
考虑以下代码:
#include <iostream>
#include <vector>
#include <array>
#include <type_traits>
// Version A
template<typename T>
void f(const T& x)
{
std::cout<<"Version A"<<std::endl;
}
// Version B
template<typename... T1, template<typename...> class T>
void f(const T<T1...>& x)
{
std::cout<<"Version B"<<std::endl;
}
// Version C
template<typename T1 = double, typename TN = size_t, template<typename, TN...> class T, TN... N>
void f(const T<T1, N...>& x)
{
std::cout<<"Version C"<<std::endl;
}
// Main
int main(int argc, char* argv[])
{
f(double());
f(std::vector<double>());
f(std::array<double, 3>());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Windows上的GCC …